home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 February / PCWorld_1999-02_cd.bin / software / Komer / lotus / Fax Services / INSTALL.DSK / TOOLKIT.LSS < prev    next >
Text File  |  1996-07-19  |  255KB  |  7,126 lines

  1. ''**********************************************************************
  2. ''
  3. ''   Module Name:   cominst\toolkit\toolkit.lss
  4. ''
  5. ''   Module Code:   COMINST
  6. ''
  7. ''   Author:        Dave Dupre
  8. ''
  9. ''   Change History:
  10. ''   $Log:   //CIT/VOL1/CFLOG/logfiles/cominst/toolkit/toolkit@.lss  $
  11. '' 
  12. ''    Rev 1.264   19 Jul 1996 14:42:04   jdonohue
  13. '' Moved IncrementSharedDLLCount from main.lss to toolkit.lss
  14. '' 
  15. ''    Rev 1.263   11 Jul 1996 19:11:22   glutz
  16. '' Added SUB Lot_TurnOffNodeOptSections for cases where Suite does
  17. '' not surface the nodenodeoptions callback.
  18. '' 
  19. ''    Rev 1.262   05 Jul 1996 10:33:38   dfristro
  20. '' Changed IsDirWritable to IsPathWritable in Lot_GetNetHardDrive and
  21. '' Lot_GetLocalHardDrive.  This means we no longer insist that the dir exists,
  22. '' only that it can be created.
  23. '' 
  24. ''    Rev 1.261   14 Jun 1996 17:51:30   dfristro
  25. '' Simplified error message for excessive path length (SID_ERR_PATHLEN) to
  26. '' fix SPR RWIS36HHHN.
  27. '' 
  28. ''    Rev 1.260   14 Jun 1996 11:20:42   glutz
  29. '' SPR AFOG366LGN, Lot_AreAnyNodeOptionsAvail() was looking for reigistered
  30. '' options for each product instead of checking cinstall.ini.
  31. '' 
  32. ''    Rev 1.259   13 Jun 1996 08:31:54   glutz
  33. '' Took drive mapping out of IsPathWritable, changed order of checks in
  34. '' ValidateEditBox.
  35. '' 
  36. ''    Rev 1.258   10 Jun 1996 15:02:40   mhishinu
  37. '' Replaced two LEFT calls with LEFTBP to fix DBCS bug.
  38. '' 
  39. ''    Rev 1.257   10 Jun 1996 11:04:04   jdonohue
  40. '' Moved Lot_TrimEndSlash to setupapi.lss
  41. '' 
  42. ''    Rev 1.256   07 Jun 1996 14:56:10   jdonohue
  43. '' Ref SPR:     HAS2XQP8D
  44. '' Save number of installed objects, rather than counting cinstall.ini every time
  45. '' Use nulltrim on arguments in Lot_RegisterObject
  46. '' 
  47. ''    Rev 1.255   06 Jun 1996 11:36:42   jdonohue
  48. '' Ref SPR:     CDWT359P53
  49. '' Don't write miscellaneous object in cinstall.ini for registry uninstall key --
  50. '' this is automatically taken care of by uninstall
  51. '' 
  52. ''    Rev 1.254   05 Jun 1996 09:30:40   jdonohue
  53. '' Changed uninstall entry to delete entire uninstall entry, not just uninstallstring
  54. '' 
  55. ''    Rev 1.253   23 May 1996 12:21:34   jdonohue
  56. '' Replaced LEFTBP calls with LEFT
  57. '' 
  58. ''    Rev 1.252   16 May 1996 14:17:12   glutz
  59. '' RemovePriorVersion() buffers calls until told to execute.
  60. '' 
  61. ''    Rev 1.251   15 May 1996 13:21:32   jdonohue
  62. '' Ref SPR:    MSUN35PJBG
  63. '' Changed Winhelp call argument from "Overview" to "Install"
  64. '' 
  65. ''    Rev 1.250   02 May 1996 10:04:08   jdonohue
  66. '' Ref SPR:    RDOEHL4E94
  67. ''             PNOT2XUJRK
  68. '' Changed handling of writing uninstall string so that quotes are placed around
  69. '' arguments if the Windows new shell in use (Windows 95 and NT V. 4.0); quotes
  70. '' are NOT used for Windows NT 3.51 because of a bug in the MS Setup toolkit that
  71. '' truncates the command line with quotes.  So embedded spaces and other special
  72. '' characters (such as -) are NOT supported under Windows NT 3.51
  73. '' 
  74. ''    Rev 1.249   02 May 1996 09:22:04   glutz
  75. '' Added function RemovePriorVersion() for sspawning Uninstall.
  76. '' 
  77. ''    Rev 1.248   26 Apr 1996 08:51:38   jdonohue
  78. '' Ref SPR:    CDWT34ULDZ
  79. '' Added missing function DL_SetOraclePath (probably obsolete)
  80. '' 
  81. ''    Rev 1.247   11 Apr 1996 09:04:26   glutz
  82. '' Lot_FixupSourceDirectories check for sections in copy list.
  83. '' 
  84. ''    Rev 1.246   10 Apr 1996 16:26:20   jdonohue
  85. '' Added error checking to Lot_FixupSourceDirectories and OneUp
  86. '' 
  87. ''    Rev 1.245   10 Apr 1996 12:45:40   jdonohue
  88. '' Removed comments in Lot_FixupSourceDirectories -- enable stripping of path components
  89. '' 
  90. ''    Rev 1.244   05 Apr 1996 14:28:50   jdonohue
  91. '' Use new function FGetSectionFileList to get font filenames even if they
  92. '' have been renamed in the .INF file
  93. '' 
  94. ''    Rev 1.243   04 Apr 1996 21:41:46   glutz
  95. '' Added function Lot_AreAnyNodeOptionsAvail().
  96. '' 
  97. ''    Rev 1.242   04 Apr 1996 13:34:06   jdonohue
  98. '' Backed out fix for embedded spaces in pathnames (adding quotes) so that NT
  99. '' 3.51 uninstall icon will work for Suite 97 Beta 
  100. '' 
  101. ''    Rev 1.241   01 Apr 1996 15:10:14   jdonohue
  102. '' For Smartsuite, remove two levels of directory in MarkFixupSourceDirectory
  103. '' 
  104. ''    Rev 1.240   29 Mar 1996 16:25:26   jdonohue
  105. '' Added function OneUp which is called in Lot_FixupSourceDirectories to remove
  106. '' the last path element from the Smartmasters type destination symbol
  107. '' 
  108. ''    Rev 1.239   04 Mar 1996 08:32:08   jdonohue
  109. '' Remove 16 bit shared component support -- pass 1 : eliminate LOTUSAPP
  110. '' 
  111. ''    Rev 1.238   27 Feb 1996 15:32:24   jdonohue
  112. '' Added Lot_RegisterTypeLib that creates registry entries for Type Libraries
  113. '' 
  114. ''    Rev 1.237   15 Feb 1996 19:12:24   jdonohue
  115. '' Do not initialize LOTUSFONTSDIR
  116. '' 
  117. ''    Rev 1.236   31 Jan 1996 15:26:12   jdonohue
  118. '' Added code to delete the Product entries under Smartsuite for a single product
  119. '' install so that uninstall will work
  120. '' 
  121. ''    Rev 1.235   30 Jan 1996 15:04:50   jdonohue
  122. '' Added registry key value "InfFileName" for products in suite uninstall
  123. '' 
  124. ''    Rev 1.234   25 Jan 1996 16:28:22   jdonohue
  125. '' Added registry key under Products for prod/ver that are part of suite
  126. '' Added preliminary code for enabling single uninstall icon for suite
  127. '' Register uninstall registry objects under first product rather than UINST
  128. '' 
  129. ''    Rev 1.233   23 Jan 1996 16:27:00   cmoy
  130. '' HISHI: Merged FE changes
  131. '' 
  132. ''    Rev 1.232   19 Jan 1996 17:08:26   jdonohue
  133. '' Initialize SYM_LOTUSFONTSDIR$ in InitializeWinWinSysDir
  134. '' Add uninstall object for uninstall string
  135. '' 
  136. ''    Rev 1.231   18 Jan 1996 13:35:56   jdonohue
  137. '' Added function Lot_RegisterFonts to provide automatic font registration
  138. '' Removed functions Lot_AddFontByID and Lot_AddFontByName, not needed anymore
  139. '' 
  140. ''    Rev 1.230   17 Jan 1996 14:19:30   glutz
  141. '' Added SUB ComboSelChanged and FUNCTION GetPathFromComboEdit.
  142. '' 
  143. ''    Rev 1.229   04 Jan 1996 15:52:58   jdonohue
  144. '' Ref SPR:    TBAT2WAT6P
  145. '' Don't test InOrOut flag if file in copy list in Lot_WhereIsFeature -- this
  146. '' allows previously installed files to be found
  147. '' 
  148. ''    Rev 1.228   02 Jan 1996 16:15:28   jdonohue
  149. '' Use SYM_LOTUSFONTSDIR$ for location of fonts directory in Lot_AddFontByName
  150. '' 
  151. ''    Rev 1.227   22 Dec 1995 15:02:44   jdonohue
  152. '' Removed all references to SYM_PARENTDIR$ -- is now SYM_BASEDIR$ for all
  153. '' Added Function Lot_RegIni for future use
  154. '' 
  155. '' 
  156. ''    Rev 1.226   21 Dec 1995 14:09:16   jdonohue
  157. '' Added subs Lot_AddFontByID and Lot_AddFontByName.  These functions register a
  158. '' font with Windows and add to registry. It is assumed all fonts are installed
  159. '' to the Windows system directory
  160. '' 
  161. ''    Rev 1.225   14 Dec 1995 15:42:18   jdonohue
  162. '' Save original install directory location in  Lot_GetInstallDir instead of
  163. '' Lot_GetDestDirValueFromInstallini
  164. '' 
  165. ''    Rev 1.224   13 Dec 1995 16:29:54   jdonohue
  166. '' Ref SPR: PNOT2XUJRK
  167. '' Added quotes around pathname strings in command line to uninstall in
  168. '' Lot_RegisterUninstaller
  169. '' 
  170. ''    Rev 1.223   12 Dec 1995 11:29:48   jdonohue
  171. '' SPR Ref: TBAT2XLLZN
  172. '' Modified Lot_GetDestDirValueFromInstallini per Brian O'Donovan's suggestion t
  173. '' preserve the location of the cinstall.ini file in a static variable; this
  174. '' should point to the correct cinstall.ini for MLC installs as well
  175. '' 
  176. ''    Rev 1.222   11 Dec 1995 17:38:38   jdonohue
  177. '' Added PopulateCOBJECTLIST function to construct a list of objects in .INI 
  178. '' file; check list before creating miscellaneous object
  179. '' 
  180. ''    Rev 1.221   11 Dec 1995 14:06:32   jdonohue
  181. '' Lot_FixupSourceDirectories: added check for null source or destination
  182. '' 
  183. ''    Rev 1.220   11 Dec 1995 13:59:14   jdonohue
  184. '' Added subs Lot_FixupSourceDirectories and MarkFixupSourceDirSymbol for settin
  185. '' correct source location for node installs
  186. '' 
  187. ''    Rev 1.219   08 Nov 1995 16:58:30   tveerapp
  188. '' Fixes fot SPR#RMOO2xQQDY
  189. '' 
  190. ''    Rev 1.218   27 Oct 1995 17:07:26   glutz
  191. '' Lot_CheckPath does a NullTrim before proceeding.
  192. '' 
  193. ''    Rev 1.217   Oct 24 1995 16:55:18   cmoy
  194. '' removed eof char
  195. '' 
  196. ''    Rev 1.216   Oct 24 1995 16:25:58   mzgripce
  197. '' added Lot_CallWinhelp32 subroutine
  198. '' 
  199. ''    Rev 1.215   13 Oct 1995 15:41:14   amontalv
  200. '' For some reason the routine FGetListLength() was losing the symbol passed to it
  201. '' if it was called a second time.  We put a check in to make sure it doesn't.
  202. '' 
  203. ''    Rev 1.214   27 Sep 1995 11:18:44   jdonohue
  204. '' Don't change the destination directory symbols for non-server language instal
  205. '' 
  206. ''    Rev 1.213   22 Sep 1995 15:46:06   tveerapp
  207. '' Fixed spr#TBAT2W9U2Q. Lot_whereisfetaure was extended to look in the net
  208. '' components directory.
  209. '' 
  210. ''    Rev 1.212   22 Sep 1995 15:07:24   jdonohue
  211. '' Remove SYM_LOTUSUSERDIR$ processing
  212. '' 
  213. ''    Rev 1.211   15 Sep 1995 19:59:20   amontalv
  214. '' Added Lot_GetVol() and Lot_SplitAnyPath().
  215. '' 
  216. ''    Rev 1.210   14 Sep 1995 15:35:04   amontalv
  217. '' Don't register system path!
  218. '' 
  219. ''    Rev 1.209   14 Sep 1995 14:58:22   amontalv
  220. '' Added comments
  221. '' 
  222. ''    Rev 1.208   13 Sep 1995 17:03:06   amontalv
  223. '' Moved Lot_RegAppPath from setupapi.lss to toolkit.lss and also added a parameter.
  224. '' Lot_RegAppPath now register the registry entry .
  225. '' 
  226. ''    Rev 1.207   13 Sep 1995 14:20:22   glutz
  227. '' Added function GetLastPathComponent.
  228. '' 
  229. ''    Rev 1.206   12 Sep 1995 18:56:24   glutz
  230. '' Cleaned up some error reporting in ValidatePath, ValidateEditBox and
  231. '' ValidateBrowse.
  232. '' 
  233. ''    Rev 1.205   12 Sep 1995 11:55:54   tveerapp
  234. '' Added Lot_SaveFeaturesInInstNodeIni(), PopulateCINSTNODELIST .
  235. '' 
  236. ''    Rev 1.204   12 Sep 1995 11:18:18   glutz
  237. '' In ValidatePath set SYM_LAST_ERROR_SID to readonly before calling
  238. '' IsPathWritable.
  239. '' 
  240. ''    Rev 1.203   08 Sep 1995 14:41:44   glutz
  241. '' In ValidatePath the call to Lot_cleanPath is indepenent of volume type.
  242. '' 
  243. ''    Rev 1.202   08 Sep 1995 12:38:42   glutz
  244. '' For SPR CCOL2UKQD7 ValidatePath calls Lot_CleanPath first thing for UNC paths
  245. '' 
  246. ''    Rev 1.201   07 Sep 1995 15:22:08   amontalv
  247. '' Chop off the end of icon names longer than 40 characters if in NT.
  248. '' 
  249. ''    Rev 1.200   07 Sep 1995 10:42:26   tveerapp
  250. '' Added fix for node install network mapping in Lot_GetDestDirFromInstallIni.
  251. '' 
  252. ''    Rev 1.199   31 Aug 1995 14:00:48   tveerapp
  253. '' Fixed GetSymbolValue arg when building cinstnod.ini path
  254. '' 
  255. ''    Rev 1.198   31 Aug 1995 12:58:10   tveerapp
  256. '' NodeInstIni file path was not built correctly.Fix for spr# DCRP2UWNLS
  257. '' 
  258. ''    Rev 1.197   28 Aug 1995 16:53:00   jdonohue
  259. '' Changed USERDIR to LOTUSUSERDIR, lotususr to lotuser
  260. '' 
  261. ''    Rev 1.196   28 Aug 1995 13:32:14   amontalv
  262. '' Changed the uninstall entry to always be under \HLM\SOFTWARE\Microsoft\Windows\...
  263. '' and not \HLM\SOFTWARE\Microsoft\Windows NT\... when in NT.  Microsoft does this
  264. '' and it avoids security issues.
  265. '' 
  266. ''    Rev 1.195   24 Aug 1995 07:55:58   jdonohue
  267. '' Added SYM_USERDIR and set it
  268. '' 
  269. ''    Rev 1.194   23 Aug 1995 15:35:32   cmoy
  270. '' Added CONST MAX_NO_DRIVE_COMBOS
  271. '' 
  272. ''    Rev 1.193   21 Aug 1995 15:41:40   amontalv
  273. '' Put name of registry keys into globals.lss
  274. '' 
  275. ''    Rev 1.192   16 Aug 1995 20:33:28   amontalv
  276. '' Added code to do error messages for registry.
  277. '' 
  278. ''    Rev 1.191   16 Aug 1995 12:27:46   mmeth
  279. '' fix for  SPR# DCRP2UWNS9
  280. '' The node install was trying to write the path to the install directory
  281. '' into the registry.  Instead, we needed to write the path to the 
  282. '' target directory.
  283. '' 
  284. ''    Rev 1.190   15 Aug 1995 12:32:34   glutz
  285. '' Had to set the text for "Path not writable" just before displaying message.
  286. '' 
  287. ''    Rev 1.189   14 Aug 1995 17:00:22   amontalv
  288. '' During creation of Uninstall program group icon, I needed to point to the file again
  289. '' in the fourth parameter.  I though that that was starting directory, but seems to
  290. '' deal with icon.
  291. '' 
  292. ''    Rev 1.188   14 Aug 1995 11:12:28   jdonohue
  293. '' Allow filenames with more than 12 characters in MakePath
  294. '' 
  295. ''    Rev 1.187   09 Aug 1995 12:01:46   cmoy
  296. '' Commented out ProdAcronym variable. This is  not used
  297. '' 
  298. ''    Rev 1.186   Aug 09 1995 11:49:16   cmoy
  299. '' remove declaration on LOT_WRITECRITICALDIRECTORIES
  300. '' 
  301. ''    Rev 1.185   08 Aug 1995 12:55:14   tveerapp
  302. '' Added Lot_WriteCriticalDirectories. It is called in Lot_SaveFeaturesInInstal
  303. '' Ini. 
  304. '' 
  305. ''    Rev 1.184   07 Aug 1995 11:49:32   tveerapp
  306. '' Added a new function Lot_GetDestDirSymFrom InstallIni().
  307. '' 
  308. ''    Rev 1.183   07 Aug 1995 09:14:02   mmeth
  309. '' Fixed a typo I put in wrt a comment character.
  310. '' 
  311. ''    Rev 1.182   07 Aug 1995 08:24:52   mmeth
  312. '' Part 2 of fix for SPR# JHOH2M4HZL:
  313. '' No longer check length of strings being written in Lot_WriteToRiFile.
  314. '' Because this C function now truncates the length to 80 bytes + terminator
  315. '' itsself.  ALso changed the length of buffers to 82 in Lot_ReadDefaultsfromRi
  316. '' to handle the 80 bytes of characters plus terminating character.
  317. '' 
  318. ''    Rev 1.181   05 Aug 1995 13:27:10   jdonohue
  319. '' Backed out code to eliminate non-network drives for server install
  320. '' 
  321. ''    Rev 1.180   04 Aug 1995 17:27:08   amontalv
  322. '' Fixed command for uninstall icon.
  323. '' 
  324. ''    Rev 1.179   04 Aug 1995 16:38:36   glutz
  325. '' More subtle changes to ValidatePath.
  326. '' 
  327. ''    Rev 1.178   04 Aug 1995 12:24:04   glutz
  328. '' Cleaned up a problem displaying errors from ValidatePath.
  329. '' 
  330. ''    Rev 1.177   04 Aug 1995 08:42:58   glutz
  331. '' Changed the way ValidatePath handle some error messages.
  332. '' 
  333. ''    Rev 1.176   03 Aug 1995 15:41:22   amontalv
  334. '' Added one to length of registry entry for Uninstall.
  335. '' 
  336. ''    Rev 1.175   03 Aug 1995 15:32:42   glutz
  337. '' Changing method for error mesaages in ValidatePath.
  338. '' 
  339. ''    Rev 1.174   02 Aug 1995 16:20:10   amontalv
  340. '' Changed uninstall flags.  /L -> /O and /P -> /L
  341. '' 
  342. ''    Rev 1.173   02 Aug 1995 10:03:44   glutz
  343. '' Added unc volumes to server list in Lot_GetDriveFreeSpaceList.
  344. '' 
  345. ''    Rev 1.172   01 Aug 1995 16:14:52   amontalv
  346. '' Added uninstall information for ininstall icon
  347. '' 
  348. ''    Rev 1.171   01 Aug 1995 11:04:04   glutz
  349. '' Changed the order of some of the checks in ValidatePath so that UNC roots
  350. '' would be checked before invalid path names.
  351. '' 
  352. ''    Rev 1.170   31 Jul 1995 15:00:26   jdonohue
  353. '' Moved Reg_??? functions to Register.lss
  354. '' Added code to select only network drives for server install
  355. '' 
  356. ''    Rev 1.169   31 Jul 1995 10:54:28   amontalv
  357. '' No change
  358. '' 
  359. ''    Rev 1.168   28 Jul 1995 11:59:26   glutz
  360. '' IsPathWritable now passes the UNC path to Lot_CheckPath.
  361. '' 
  362. ''    Rev 1.167   27 Jul 1995 16:18:42   pdonahue
  363. '' added code to surface new error message 
  364. '' 
  365. ''    Rev 1.166   27 Jul 1995 14:01:34   amontalv
  366. '' Added call to create icons for uninstall in WinNt.
  367. '' 
  368. ''    Rev 1.165   27 Jul 1995 11:04:28   amontalv
  369. '' Added call Lot_AddLinkIconToFolder so that icon information can be sent
  370. '' when creating a shortcut.
  371. '' 
  372. ''    Rev 1.164   24 Jul 1995 11:39:38   glutz
  373. '' Read sn.dat from temp directory.
  374. '' 
  375. ''    Rev 1.163   20 Jul 1995 12:58:52   jdonohue
  376. '' Changed CopyFile to FCopyFile, which calls Win32 CopyFile instead of MS-Setup
  377. '' FCopyOneFile
  378. '' 
  379. ''    Rev 1.162   20 Jul 1995 10:53:54   glutz
  380. '' GetFreeSpace now returns K bytes so I made changes accordingly.
  381. '' 
  382. ''    Rev 1.161   20 Jul 1995 08:02:48   jdonohue
  383. '' Added check for null string in ValidatePath
  384. '' 
  385. ''    Rev 1.160   19 Jul 1995 16:37:24   glutz
  386. '' lcbNeed is now K bytes based so I took the \ 1024 out of CheskForSpace.
  387. '' 
  388. ''    Rev 1.159   18 Jul 1995 09:17:26   glutz
  389. '' ValidateBrowse was not updating edit box for UNC paths.
  390. '' 
  391. ''    Rev 1.158   17 Jul 1995 16:38:06   glutz
  392. '' Added function ValidateBrowse to set the combo and edit boxes after a browse.
  393. '' 
  394. ''    Rev 1.157   17 Jul 1995 15:52:12   glutz
  395. '' ValidatePath was checking path length before it was cleaning the path
  396. '' This would allow installation to \flw\..\
  397. '' 
  398. ''    Rev 1.156   17 Jul 1995 15:32:36   amontalv
  399. '' Changed the prodno in Lot_AddLinkToFolder to always be 1.
  400. '' 
  401. ''    Rev 1.155   17 Jul 1995 13:51:50   amontalv
  402. '' Added "Overview" to Windows Help, so that we would have the new help look.
  403. '' 
  404. ''    Rev 1.154   17 Jul 1995 13:33:08   glutz
  405. '' All error messages concerning paths are suppressed if a UNC volume
  406. '' cannot be mapped to a drive letter.
  407. '' 
  408. ''    Rev 1.153   13 Jul 1995 11:25:34   tveerapp
  409. '' Modified the comments for Reg_GetObsFiles.
  410. '' 
  411. ''    Rev 1.152   13 Jul 1995 11:22:26   tveerapp
  412. '' Added Reg_SetObsFiles, RegGetObsFilesto support Obsolete files flag.
  413. '' 
  414. ''    Rev 1.151   12 Jul 1995 16:53:26   glutz
  415. '' Had to limit the length of the unc volume int the insufficient disk
  416. '' space dialog.
  417. '' 
  418. ''    Rev 1.150   11 Jul 1995 12:09:24   tveerapp
  419. '' Changed Lot_RegiterUinstallhandler, Lot_RegisterObjects to not
  420. '' register during a server, distrbution install.
  421. '' 
  422. ''    Rev 1.149   07 Jul 1995 15:58:32   glutz
  423. '' Added UNC volumes to CheckForSpace routine.
  424. '' 
  425. ''    Rev 1.148   06 Jul 1995 12:23:04   mzgripce
  426. '' change the destination of the uninstaller fron the components directory
  427. '' to the windows directory
  428. '' 
  429. ''    Rev 1.147   28 Jun 1995 15:54:36   tveerapp
  430. '' Fixed EXECUTE requiring Sub Initialize.
  431. '' 
  432. ''    Rev 1.146   27 Jun 1995 15:54:32   mzgripce
  433. '' put the execute string between sub initialize and end sub to enable 
  434. '' on error / error # handeling for share processing
  435. '' 
  436. ''    Rev 1.145   23 Jun 1995 17:09:24   mzgripce
  437. '' fixed jmoy2t4pny pert 2 by compensating if the user starts a path with no \
  438. '' 
  439. ''    Rev 1.144   23 Jun 1995 12:47:42   mzgripce
  440. '' add program_group class 
  441. '' 
  442. ''    Rev 1.143   23 Jun 1995 12:22:12   jdonohue
  443. '' Added FindResourceinDLL function, add global string for name of our generic
  444. '' dialog proc and use in AddToBillboardList (original argument not used)
  445. '' 
  446. ''    Rev 1.142   22 Jun 1995 17:27:08   mzgripce
  447. '' add hive class to register object
  448. '' 
  449. ''    Rev 1.141   22 Jun 1995 12:43:56   jdonohue
  450. '' Revised AddToBillboardList to look for resource in list of DLLs
  451. '' 
  452. ''    Rev 1.140   22 Jun 1995 10:59:00   mzgripce
  453. '' change the cinstnode.ini filename to cinstnod.ini 
  454. '' 
  455. ''    Rev 1.139   21 Jun 1995 14:27:28   glutz
  456. '' Added function ValidateEditBox to check edit box
  457. '' strings for valid letter drives or UNC volumes
  458. '' 
  459. ''    Rev 1.138   19 Jun 1995 18:45:18   mzgripce
  460. '' change lot_callShare to call the sharetools if share or share32 are supported
  461. '' 
  462. ''    Rev 1.137   19 Jun 1995 17:40:12   mzgripce
  463. '' change the key Display Name to DisplayName (for uninstaller)
  464. '' 
  465. ''    Rev 1.136   19 Jun 1995 16:39:44   mzgripce
  466. '' add Lot_RegisterObject
  467. '' 
  468. ''    Rev 1.135   19 Jun 1995 10:27:20   amontalv
  469. '' Put in code to add function to New Folder button and Remove Folder button.  Also
  470. '' fixed some of the selection problems in the tree list.
  471. '' 
  472. ''    Rev 1.134   15 Jun 1995 19:41:30   amontalv
  473. '' Checked for and changed integers passed to C functions.  Changed to longs.
  474. '' 
  475. ''    Rev 1.133   15 Jun 1995 17:52:20   amontalv
  476. '' The problem with the program groups and errors with installed features was that
  477. '' the C code FFindFirst() expected a integer that contained the flag for which to look.
  478. '' In LotusScript when we called this function we passed an integer, but an integer
  479. '' in Script is different than an integer in C.  The fix is to convert the Script
  480. '' integer to a long using Clng() at the call for the C function.
  481. '' 
  482. ''    Rev 1.132   13 Jun 1995 17:27:08   mzgripce
  483. '' import FWriteDestinationSymAndVal, write Lot_WriteDestinationSymAndVal 
  484. '' subroutine and call it in Lot_SaveFeature to register the dir symbols
  485. '' and their values for uninstall
  486. '' 
  487. ''    Rev 1.131   12 Jun 1995 15:10:30   tveerapp
  488. '' Added a check in the function Lot_TrimEndSlash. Checks if the
  489. '' string is of length > 0. Script's MID$ chokes on an empty path string.
  490. '' 
  491. ''    Rev 1.130   09 Jun 1995 17:05:42   mzgripce
  492. '' added Lot_Register_Uninstaller
  493. '' 
  494. ''    Rev 1.129   09 Jun 1995 15:08:54   amontalv
  495. '' Added code to set global variable in START.LSS to error condition value.
  496. '' 
  497. ''    Rev 1.128   09 Jun 1995 14:25:58   glutz
  498. '' Fixed unc mapping bug
  499. '' 
  500. ''    Rev 1.127   09 Jun 1995 11:28:38   jdonohue
  501. '' Send quit message to WinHelp
  502. '' 
  503. ''    Rev 1.126   08 Jun 1995 16:48:54   jdonohue
  504. '' Added cancel option for tight disk space message box
  505. '' 
  506. ''    Rev 1.123   07 Jun 1995 17:50:12   amontalv
  507. '' Set the Selected folder to the root only the first time that
  508. '' Reg_SetProgManagerGroup is called.
  509. '' 
  510. ''    Rev 1.122   07 Jun 1995 16:30:44   amontalv
  511. '' Changed the Win95 start folder so that it initializes
  512. '' earlier in the program.  This should make automation
  513. '' easier to implement for it.  There are still a couple of
  514. '' bugs that I need to work out, but I feel that I should
  515. '' check what I have now.
  516. '' 
  517. ''    Rev 1.121   07 Jun 1995 11:23:24   glutz
  518. '' ValidatePath and IsPathwritable now work with UNC volumes
  519. '' 
  520. ''    Rev 1.120   06 Jun 1995 15:59:28   amontalv
  521. '' We are experiencing problems with LotusScript when we fill buffers with
  522. '' nulls and then pass them to C routines.  For the time being, it is suggested
  523. '' that we fill our buffers with spaces.  To this end (and to make it
  524. '' easier to change back later) I have created a small LotusScript routine
  525. '' named CreateBuffer.  You use it any time you ordinarily would use
  526. '' STRING$(num, 0).  CreateBuffer() just needs the num, it decides what to
  527. '' fill the buffer with (sorry about the grammer).  Right now it fill the
  528. '' buffer with spaces.  Later we will change it back to nulls.  Also look
  529. '' at the routine NullTrim().  It will get rid of final nulls and spaces.
  530. '' You can use this when getting a buffer that has been changed or filled
  531. '' in a external C routine.
  532. '' 
  533. ''    Rev 1.119   06 Jun 1995 15:34:44   mzgripce
  534. '' added 3 fields ti the prods struct to support moreDirectories prompt and
  535. '' 4 CIT functions (one set and three gets) to register this data with CIT
  536. '' 
  537. ''    Rev 1.118   05 Jun 1995 18:15:22   tveerapp
  538. '' Removed SetTheComponentsDir. This is taken care of in InitShare32
  539. '' in share32.lss.
  540. '' 
  541. ''    Rev 1.117   05 Jun 1995 16:37:20   amontalv
  542. '' Made changes for migrating to LotusScript version 3.0.37.
  543. '' 
  544. ''    Rev 1.116   02 Jun 1995 14:49:06   tveerapp
  545. '' Changed IDC_HELP to IDC_CITHELP.
  546. '' 
  547. ''    Rev 1.115   02 Jun 1995 08:54:26   glutz
  548. '' Lot_checkPath calls Lot_SplitUNCPath
  549. '' 
  550. ''    Rev 1.114   01 Jun 1995 17:02:04   glutz
  551. '' Lot_GheckPath works with UNC paths
  552. '' 
  553. ''    Rev 1.113   01 Jun 1995 11:11:44   amontalv
  554. '' Added API function CreateLink to create shortcuts.  Also added functions
  555. '' to save and get the link path to support the CreateLink.  I also changed
  556. '' the startup program folder code to use the default dialog proc and changed
  557. '' the default dialog proc to process directory trees.
  558. '' 
  559. ''    Rev 1.112   31 May 1995 09:52:20   callanan
  560. '' Accessing help from the lotustmp dir not the current directory as the 
  561. '' current directory changes when you change drive.
  562. '' 
  563. ''    Rev 1.111   30 May 1995 15:43:34   amontalv
  564. '' Made a new function PopupWithFunction.  PopupModalDlg now calls this.  Needed to
  565. '' do this to call dialog with my own dialog function.
  566. '' 
  567. ''    Rev 1.110   30 May 1995 13:09:32   jdonohue
  568. '' Pass DLL list in argument to FDoDialog
  569. '' 
  570. ''    Rev 1.109   30 May 1995 10:00:00   amontalv
  571. '' Added routine PopupFolderDlg to put up the Win95 Program folder dialog.
  572. '' 
  573. ''    Rev 1.108   25 May 1995 20:43:40   amontalv
  574. '' Checked in for Greg Lutz.  He commented out code that validated path in order
  575. '' to get long file names.
  576. '' 
  577. ''    Rev 1.107   19 May 1995 19:06:00   glutz
  578. '' Added some comments to UNC functions
  579. '' 
  580. ''    Rev 1.106   18 May 1995 12:21:20   tveerapp
  581. '' Added SetTheComponentsDir stub.MZ to fill in contents.
  582. '' 
  583. ''    Rev 1.105   18 May 1995 10:37:46   jdonohue
  584. '' Fixed logic for AddToBillboardList with multiple resource DLLs
  585. '' 
  586. ''    Rev 1.104   17 May 1995 17:53:50   mzgripce
  587. '' Change Reg_SetLicenserSupport() and Reg_SetLicenseSelected() to eliminate
  588. '' Licenser support 
  589. '' 
  590. ''    Rev 1.103   16 May 1995 17:13:06   amontalv
  591. '' Had to change the name of the dialog proc to _FNameOrgDlgProc@16.
  592. '' 
  593. ''    Rev 1.102   16 May 1995 17:07:56   glutz
  594. '' Split all automation functions out to automate.lss
  595. '' 
  596. ''    Rev 1.101   16 May 1995 09:19:52   glutz
  597. '' Added wrappers for
  598. '' FAddToDriveFreeSpaceList
  599. '' FIsUnvalidatedUNCPath
  600. '' FisValidUNCPath
  601. '' Added SUB Lot_SplitUNCPath
  602. '' Added functions'
  603. '' Lot_IsUnvalidatedUNCPath
  604. '' Lot_IsValidUNCPath
  605. '' Modified
  606. '' IsPathWritable
  607. '' ValidatePath
  608. '' SelectDriveCombo
  609. '' 
  610. ''    Rev 1.100   15 May 1995 11:19:18   jdonohue
  611. '' Call SetUpApi in initialize function
  612. '' 
  613. ''    Rev 1.99   11 May 1995 16:55:58   tveerapp
  614. '' Added a global variable gLogFile$ . Commented out the calls
  615. '' to WriteToLogFile - this is no longer a function.
  616. '' 
  617. ''    Rev 1.98   03 May 1995 18:17:40   mzgripce
  618. '' fix the syntax errors 
  619. '' 
  620. ''    Rev 1.97   03 May 1995 11:45:56   tveerapp
  621. '' Fixed the cfbuild-c2build merge.
  622. '' 
  623. ''    Rev 1.96   02 May 1995 17:51:08   mzgripce
  624. '' fixed some syntax errors in new features 
  625. '' 
  626. ''    Rev 1.95   02 May 1995 12:53:34   cmoy
  627. '' Merged c2 into cf build
  628. '' 
  629. ''    Rev 1.88   27 Apr 1995 16:48:10   mheerman
  630. '' Removed debug print from help case.
  631. ''    Rev 1.92F  26 Apr 1995 17:33:42   mzgripce
  632. '' replace TwoMainDirFlag with ExtraProdDirsNum and change the 
  633. '' subroutine and function name that process it.
  634. '' 
  635. ''    Rev 1.91F  25 Apr 1995 17:10:46   mzgripce
  636. '' add a new field: TwoMainDirFlag to ProdInfo Structure
  637. '' add SUBROUTINE Reg_SetTwoMainDirFlag and FUNCTION Reg_GetProdSupportForTwo-
  638. '' MainDir()
  639. '' change Reg_RegisterProductNames to set TwoMainDirFlag to 0
  640. '' 
  641. ''    Rev 1.87   14 Apr 1995 16:03:16   amontalv
  642. '' Deleted code that took care of final null in nul terminated strings.
  643. ''    Rev 1.90F  25 Apr 1995 11:45:20   tveerapp
  644. '' Added Lot_AutoCustomizeShare().
  645. '' 
  646. ''    Rev 1.86   10 Apr 1995 17:58:42   amontalv
  647. '' Made changes to functions and to some callback routines.
  648. ''    Rev 1.89F  24 Apr 1995 14:02:08   tveerapp
  649. '' Fixed Lot_AutoInstallCustomize.
  650. '' 
  651. ''    Rev 1.88   19 Apr 1995 14:38:24   jdonohue
  652. '' Changed SYM_CUIDLL$ from DLL name to list of DLLs in PopupMod..Dialog and 
  653. '' AddToBillboardList
  654. '' 
  655. ''    Rev 1.87F  13 Apr 1995 10:46:36   mzgripce
  656. '' Add Share32 field to ProdInfo struct
  657. '' Change Reg_RegiserProductNames to set the default of Share32 to 0
  658. '' added: Lot_AreShare32ToolsSupported(); Lot_GetShare32ToolsSize()
  659. '' Reg_GetProdSupportForShare32(); Reg_SetShare32Flag()
  660. '' 
  661. ''    Rev 1.86F  13 Apr 1995 19:00:20   tveerapp
  662. '' Added Lot_AutoInstallCustomize.
  663. '' 
  664. ''    Rev 1.85   05 Apr 1995 19:53:52   amontalv
  665. '' Porting to 32 bit.
  666. '' 
  667. ''    Rev 1.84   31 Mar 1995 18:47:52   amontalv
  668. '' Had to add aliases to function names for LotusScript to find them in DLLs
  669. '' 
  670. ''    Rev 1.83   20 Jan 1995 16:42:48   tveerapp
  671. '' 
  672. '' Fixed spr# ccol2nsl4. In autogetsetlicenser,moved the if licselected% to the right place.
  673. '' 
  674. ''    Rev 1.82   17 Jan 1995 16:45:12   tveerapp
  675. '' 
  676. '' Replaced existing error message for AutoCheckForspace.
  677. '' Fixes spr# TVEN2NBNEP.
  678. '' 
  679. ''    Rev 1.81   14 Jan 1995 15:58:54   jplump
  680. '' 
  681. '' Removed else case in Lot_AutoSuiteAppSelect. Before this routine
  682. '' is called in main, there is a check to see if the product is a
  683. '' SUITE; if it is not, this routine is not called. Therefore, the
  684. '' else case (if not Suite) in this routine won't happen. If the logic
  685. '' in main changes not to check for Suite, then the else case should
  686. '' not post an error for the user, but return to main without looking
  687. '' for Suite Applications.
  688. '' 
  689. ''    Rev 1.80   13 Jan 1995 11:28:18   jplump
  690. '' 
  691. '' In Lot_AutoGetInstallType, added option 4 (node). This option really doesn't
  692. '' do anything if the user has already done a server install and is doing a 
  693. '' legitimate node install. However, if the user has not done a server install
  694. '' and puts 4 as the install type, an error will be displayed. This error tells
  695. '' the user that he must to a server install first.
  696. '' 
  697. '' 
  698. '' 
  699. ''    Rev 1.79   11 Jan 1995 10:28:24   tveerapp
  700. '' 
  701. '' Fixed the logic in the AutoNodeoptions processing. Changed the OR to AND.
  702. '' The error should be signaled only if it is neither a 1 nor a 0.
  703. '' 
  704. ''    Rev 1.78   10 Jan 1995 19:04:38   jplump
  705. '' 
  706. '' When processing values from RSP file in automation,
  707. '' added check for missing value before casting string
  708. '' to integer. This is a workaround for a bug in
  709. '' LotusScript. An empty string should be a 0 when 
  710. '' cast to an integer (CINT), but it is not.
  711. '' SPR JMOY2N7QVK
  712. '' 
  713. ''    Rev 1.77   09 Jan 1995 16:50:32   tveerapp
  714. '' 
  715. '' Removed redundant code from Lot_CheckRSPPath as a result of the preious change(1).
  716. '' 
  717. ''    Rev 1.76   09 Jan 1995 16:48:04   tveerapp
  718. '' 
  719. '' Two changes:
  720. '' 1. Fixed the default for Lot_CheckRSPPath's return value to be "".
  721. '' 2. Fixed spr# JHOH2N7PHF
  722. '' 
  723. ''    Rev 1.75   07 Jan 1995 18:26:02   jplump
  724. '' 
  725. '' Made changes to keyword and section processing in Lot_Auto???
  726. '' functions to reflect changes in auto.rsp due to DOC review.
  727. '' 
  728. '' 
  729. ''    Rev 1.74   07 Jan 1995 15:56:20   jplump
  730. '' 
  731. '' In Lot_AutoCheckRSPPath fixed problem with function
  732. '' returning and invalid path. Calling functions should
  733. '' expect an empty string as a return value if the path
  734. '' is invalid.
  735. '' 
  736. ''    Rev 1.73   30 Dec 1994 14:12:28   jplump
  737. '' 
  738. '' Removed section name from error case in Select Applications processing
  739. '' 
  740. ''    Rev 1.72   30 Dec 1994 14:00:40   jplump
  741. '' 
  742. '' Added Lot_Auto_CheckRSPPath to validate paths in the response file.
  743. '' If the user does not supply a path in the rsp file, he\she will get
  744. '' this message: "Automated Install Error. Response File: One or more
  745. '' product directory paths are invalid in section:      " If the user
  746. '' supplies a path that is invalid, the invalid path message will be
  747. '' displayed first, and then Automated Install Error.
  748. '' 
  749. '' 
  750. ''    Rev 1.71   23 Dec 1994 18:34:30   jplump
  751. '' 
  752. '' Changed automation errors to be resourced errors.
  753. '' 
  754. ''    Rev 1.70   23 Dec 1994 14:07:44   jplump
  755. '' 
  756. '' Added Lot_AutoGetSetLicenserInfo
  757. '' Removed print statements
  758. '' Enhanced AutoDebug function
  759. '' 
  760. '' 
  761. ''    Rev 1.69   22 Dec 1994 15:09:08   tveerapp
  762. '' 
  763. '' Added Error Msg to AutoCheckForSpace
  764. '' 
  765. ''    Rev 1.68   22 Dec 1994 14:27:16   tveerapp
  766. '' 
  767. '' Fixed a type mismatch
  768. '' 
  769. ''    Rev 1.67   22 Dec 1994 14:22:42   tveerapp
  770. '' 
  771. '' Modified Lot_AutoGetProductDestDir.. for suite.
  772. '' 
  773. ''    Rev 1.66   22 Dec 1994 13:28:26   tveerapp
  774. '' 
  775. '' Fixed Lot_AutoSuiteAppSelect function.
  776. '' 
  777. ''    Rev 1.65   22 Dec 1994 11:38:52   tveerapp
  778. '' 
  779. '' Changed Lot_Check path to ValidatePath in Lot_AutoGetProductDestDir.
  780. '' 
  781. ''    Rev 1.64   21 Dec 1994 17:18:34   tveerapp
  782. '' 
  783. '' Fixed a type mismatch
  784. '' 
  785. ''    Rev 1.63   21 Dec 1994 17:08:22   tveerapp
  786. '' 
  787. '' Added Lot_AutoProcessNodeOptions.
  788. '' 
  789. ''    Rev 1.62   21 Dec 1994 14:58:44   tveerapp
  790. '' 
  791. '' Removed an erroneous end case
  792. '' 
  793. ''    Rev 1.61   21 Dec 1994 14:56:12   tveerapp
  794. '' 
  795. '' Fixed a typo
  796. '' 
  797. ''    Rev 1.60   21 Dec 1994 13:10:00   tveerapp
  798. '' 
  799. '' Added a missing end if and Next
  800. '' 
  801. ''    Rev 1.59   21 Dec 1994 13:03:12   tveerapp
  802. '' 
  803. '' Added Lot_AutoSuiteAppSel function. Added Error messages that need to be resourced!!
  804. '' Modified Lot-AutoGetSIzeofInstall.
  805. '' 
  806. ''    Rev 1.58   21 Dec 1994 11:54:48   tveerapp
  807. '' 
  808. '' Modified Lot_AutoGetBase function. It returns the base directory instead of setting it.
  809. '' 
  810. ''    Rev 1.57   12 Dec 1994 11:36:34   tveerapp
  811. '' 
  812. '' Incorporated jill's changes to Lot_AutoGetProductDestinationDir and
  813. '' Lot_AutoWriteOutDebugFile. Remmed out the existing functions. These
  814. '' can be removed after verfication with jill.
  815. '' 
  816. ''    Rev 1.56   12 Dec 1994 11:05:08   mzgripce
  817. '' 
  818. '' Added 4 funcs:Lot_AutoChangeLotusAppDir(), Lot_AutoConsolidateLotusAppDir()
  819. '' Lot_AutoConsolidateMoveCopy(), Lot_AutoIsThisNetLotusApp() 
  820. '' 
  821. ''    Rev 1.55   08 Dec 1994 20:10:34   jplump
  822. '' Added Lot_AutoWriteOutDebugFile
  823. '' Fixed Lot_AutoGetProductDestDirSymbol to use prodno%
  824. '' 
  825. ''    Rev 1.54   06 Dec 1994 17:21:00   tveerapp
  826. '' 
  827. '' Modified Lot_GetKeyValFromResponseFile to set gAutoFile$ to thw
  828. '' value of the symbol processed by shell in the command line.
  829. '' 
  830. ''    Rev 1.53   06 Dec 1994 10:23:54   tveerapp
  831. '' 
  832. '' Added Lot_AutoCinfigureAutoExec function and AutoInstallReboot.
  833. '' 
  834. ''    Rev 1.52   05 Dec 1994 15:09:52   jplump
  835. '' Added Lot_AutoGetUserInfo
  836. '' 
  837. ''    Rev 1.51   02 Dec 1994 15:56:56   cmoy
  838. '' 
  839. '' Merged automation files
  840. '' 
  841. ''    Rev 1.50   02 Dec 1994 15:10:42   cmoy
  842. '' 
  843. ''    Rev 1.11   01 Dec 1994 17:30:54   tveerapp
  844. '' 
  845. '' Added The AutoCheckSpace function.
  846. '' 
  847. ''    Rev 1.10   01 Dec 1994 10:22:16   jplump
  848. '' Added character checking to Lot_AutoGetProgramGroup
  849. '' 
  850. '' 
  851. '' 
  852. ''    Rev 1.9   30 Nov 1994 10:19:56   tveerapp
  853. '' Modified RegisterCallback function to register a callback only when not
  854. '' in the automation mode.
  855. '' 
  856. ''    Rev 1.8   29 Nov 1994 14:27:22   tveerapp
  857. '' Added a check to Lot_GetKeyValFromResponseFile.
  858. '' 
  859. ''    Rev 1.7   29 Nov 1994 12:53:34   tveerapp
  860. '' 
  861. '' Added i%, nProds to the declartions.D
  862. '' 
  863. ''    Rev 1.6   29 Nov 1994 12:45:54   tveerapp
  864. '' Modified Lot_AutoGetSizeOFinstall function. It returns an integer.
  865. '' 
  866. ''    Rev 1.5   29 Nov 1994 11:42:18   jplump
  867. '' 
  868. '' Added functions:  Lot_AutoGetSizeOfInstall & 
  869. '' Lot_AutoGetProgramGroup.
  870. '' 
  871. ''    Rev 1.4   23 Nov 1994 16:27:40   tveerapp
  872. '' 
  873. '' Added Lot_AutoGetInstallType function used in main.
  874. '' 
  875. ''    Rev 1.3   23 Nov 1994 15:22:02   tveerapp
  876. '' 
  877. '' Modified PopupModal for Automation.
  878. '' 
  879. ''    Rev 1.2   23 Nov 1994 14:02:02   jplump
  880. '' Added Lot_AutoGetBaseDirSymbol
  881. '' 
  882. ''    Rev 1.1   22 Nov 1994 16:34:40   jplump
  883. '' 
  884. '' Added INIT symbol processor
  885. '' 
  886. ''    Rev 1.0   22 Nov 1994 16:26:10   jplump
  887. '' Initial Revision
  888. ''==========
  889. '' 
  890. ''    Rev 1.47   02 Nov 1994 18:33:34   jplump
  891. '' Resourced error message in ModifyAutoexec()
  892. '' SID_ERR_AUTOEXEC_NOT_COPIED
  893. '' 
  894. '' Jill Salter Plump
  895. '' 
  896. '' 
  897. ''    Rev 1.46   03 Oct 1994 11:12:12   tveerapp
  898. '' Fixed spr# 1023351. Makepath checks for 13 chars. and a \.
  899. '' If valid accepts it else returns an empty string.
  900. '' 
  901. ''    Rev 1.45   27 Sep 1994 13:05:56   cmoy
  902. '' Added constants needed for rebooting and restarting
  903. '' 
  904. ''    Rev 1.44   22 Sep 1994 09:35:42   mzgripce
  905. '' Add CDOptDefaultSelected in PRODINFO structure
  906. '' Write: SUB Reg_ReSetCDOptionSelected
  907. ''  SUB Reg_ReSetCDOptionSelectedToDefault
  908. ''  SUB Reg_ReSetAllOptSelToDefaults
  909. '' all functions for cd settings checking and change the funcs that populates 
  910. '' 
  911. ''    Rev 1.43   02 Aug 1994 11:17:58   mzgripce
  912. '' To fix Node Options bug I commented out the call to the sub
  913. '' Reg_ReSetAllNodeOptsToDefaults in the function 
  914. '' Lot_AreAnyNodeOptAvailToSrv()
  915. '' 
  916. ''    Rev 1.42   21 Jul 1994 18:09:34   thangv
  917. '' Modified return value of IsNotesinpath to be 1  if it is not in
  918. '' lotus.ini. (this will reduce the ocuurences of autoexec change dialog
  919. '' showing up).
  920. '' 
  921. ''    Rev 1.41   13 Jun 1994 17:20:12   cmoy
  922. '' 
  923. '' ADDED GETBOOTDRIVE FUNCTIONALITY
  924. '' 
  925. ''    Rev 1.40   08 Jun 1994 17:05:12   mmeth
  926. '' Fixed PopulateCINSTALLLIST.  The bug in here was that we weren't writing ov
  927. '' previous versions of cinstall.ini correctly. gNCINSTALL set to -1 instead o
  928. '' 
  929. ''    Rev 1.39   05 Jun 1994 20:21:36   ptilton
  930. '' Added Global Subroutines for Setting OracleHomeDir & NotesDataDir
  931. '' Symbols.  Moved functions for determining values for symbols from 
  932. '' SHARE.LSS
  933. '' 
  934. ''    Rev 1.38   02 Jun 1994 12:35:32   thangv
  935. '' 
  936. '' Added TrimNetlotusapp function.
  937. '' 
  938. ''    Rev 1.37   31 May 1994 14:04:54   thangv
  939. '' 
  940. '' Added Showwaitcursor and restorecursor foe fine check in CheckforSpace.
  941. '' 
  942. ''    Rev 1.36   31 May 1994 13:40:04   mmeth
  943. '' Added Function Calls for Suite to handle previous versions
  944. '' 
  945. ''    Rev 1.35   26 May 1994 07:25:00   mmeth
  946. '' In CheckForSpace the variable notused1$ was refernced, but not declared.
  947. '' 
  948. ''    Rev 1.34   25 May 1994 17:10:12   cmoy
  949. '' 
  950. '' put up a please wait dialog in CheckForSpace
  951. '' 
  952. ''    Rev 1.33   24 May 1994 16:54:16   thangv
  953. '' Set the tab to 50 from 75 in CheckForSpace.
  954. '' 
  955. ''    Rev 1.32   24 May 1994 15:47:18   mmeth
  956. '' Fixed Performance problem having to do with reading and writing CINSTALL.IN
  957. '' 
  958. ''    Rev 1.31   23 May 1994 14:50:02   mzgripce
  959. '' fix a bug in IsThe Featureinstalled 
  960. '' 
  961. ''    Rev 1.30   20 May 1994 17:24:44   mmeth
  962. '' Modified Lot_IsTheFeatureInstalled. It uses a list (CINSTALL) and
  963. '' works faster.
  964. '' 
  965. ''    Rev 1.29   12 May 1994 11:20:24   mmeth
  966. '' Adding Icons for Lic and Install and using DoMsgBox instead of MessageBox
  967. '' 
  968. ''    Rev 1.28   29 Apr 1994 16:36:36   mzgripce
  969. '' 
  970. '' fixed spr # 28650
  971. '' 
  972. ''    Rev 1.27   28 Apr 1994 13:29:38   mzgripce
  973. '' 
  974. '' added Lot_IsDestVerNewerOrEqual()
  975. '' 
  976. ''    Rev 1.26   21 Apr 1994 15:32:40   mzgripce
  977. '' 
  978. '' implement the correct err message for too long path(SID_ERR_PATHLEN_...)
  979. '' 
  980. ''    Rev 1.25   20 Apr 1994 16:45:38   thangv
  981. '' Modified Lot_AreAnyNodeOptionsAvailToSrv function to check
  982. '' for any node options not being in the copylist.
  983. '' 
  984. ''    Rev 1.24   20 Apr 1994 16:23:20   mzgripce
  985. '' 
  986. '' Reject paths that are too long.
  987. '' 
  988. ''    Rev 1.23   19 Apr 1994 10:28:32   thangv
  989. '' Added FremoveSymbol(IDC_TEXT) in Popupmodal function
  990. '' when exit button is selected.
  991. '' 
  992. ''    Rev 1.22   13 Apr 1994 09:55:28   cmoy
  993. '' 
  994. '' Added SHAREEXE and Notes as fields in Registration Database
  995. '' Added SUBS:
  996. '' Reg_SetSHAREEXESupport
  997. '' Reg_SetNotesSupport
  998. '' Added FUNCTIONS:
  999. '' Reg_GetSHAREEXESupport
  1000. '' Reg_GetNotesSupport
  1001. '' GetNotesPathfromLotusIni
  1002. '' IsNotesInPath
  1003. '' IsShareInAUTOEXEC
  1004. '' ModifyAutoexec
  1005. '' GetBootDrive
  1006. '' Added Constants
  1007. '' MANotes
  1008. '' MAShare
  1009. '' 
  1010. ''    Rev 1.21   07 Apr 1994 16:41:12   mmeth
  1011. '' changed return code for EXECUTE statement to a public variable
  1012. '' 
  1013. ''    Rev 1.20   07 Apr 1994 12:38:20   mmeth
  1014. '' Modified DOEXEC to EXECUTE.
  1015. '' 
  1016. ''    Rev 1.19   06 Apr 1994 16:28:06   mmeth
  1017. '' Added a list gEXTRA.  This list gets initialized with an etra 200000
  1018. '' bytes for the Windows drive.  This can be modified by the product groups if
  1019. '' necessary. 
  1020. '' 
  1021. ''    Rev 1.18   04 Apr 1994 18:02:18   mmeth
  1022. '' Took out share.lss depednancies for those products that don't need it.
  1023. '' 
  1024. ''    Rev 1.17   23 Mar 1994 10:11:08   mmeth
  1025. '' WhereIsFeature... fixed for SmartSuiteNode case &
  1026. '' SaveFeatureInstalled... was fixedso it would write without adding extra "\"
  1027. '' 
  1028. ''    Rev 1.16   23 Mar 1994 09:17:52   mzgripce
  1029. '' add LOOKONNETLOTUSAPP to whereIsFeature 
  1030. '' 
  1031. ''    Rev 1.15   18 Mar 1994 18:30:50   mzgripce
  1032. '' change Lot_WhereIsFeature and save Destination Directories for suit server
  1033. '' 
  1034. ''    Rev 1.14   11 Mar 1994 16:58:56   thangv
  1035. '' Added the Dist field in the Registration database
  1036. '' Added The Reg_Set.. and Reg_GetProd.. functions for dist.
  1037. '' 
  1038. ''    Rev 1.13   10 Mar 1994 17:24:54   mzgripce
  1039. '' add Lot_InitializeWinWinsysSym subroutine
  1040. '' 
  1041. ''    Rev 1.12   01 Mar 1994 17:08:30   mzgripce
  1042. '' CALL FIsKeywordInCopyList into Lot_SaveNodeOptionsInInstallIni
  1043. '' 
  1044. ''    Rev 1.11   01 Mar 1994 12:13:14   mzgripce
  1045. '' added NodeOptDefaultSelected to PRODINFO type def
  1046. '' change: Reg_RegisterProductNames and Reg_SetNodeOptionSelected
  1047. '' added: Reg_IsNodeOptionDefaultSelected
  1048. ''        Reg_ReSetNodeOptionSelectedToDefault
  1049. ''        Reg_ReSetNodeOptionSelected and
  1050. ''        Reg_ReSetAllNodeOptsSelToDefaults
  1051. '' 
  1052. ''    Rev 1.10   24 Feb 1994 12:56:12   tingmann
  1053. '' add lot_lcbsettabs
  1054. '' 
  1055. ''    Rev 1.9   23 Feb 1994 18:14:30   mzgripce
  1056. '' fix Lot_SaveTheNodeOptionsInInstallIni() (replace"1" with STR(1))
  1057. '' 
  1058. ''    Rev 1.8   22 Feb 1994 17:04:24   mzgripce
  1059. '' add Lot_AreAnyNodeOptAvailToSrv()
  1060. '' 
  1061. ''    Rev 1.7   17 Feb 1994 10:24:46   mmeth
  1062. '' Added Reg_SetAllowUserToChoseInSMartSUite
  1063. '' 
  1064. ''    Rev 1.6   16 Feb 1994 14:40:06   tingmann
  1065. '' add reg_getproductname,reg_getuiinorout, lot_lcbsetsel
  1066. '' 
  1067. ''    Rev 1.5   16 Feb 1994 12:13:46   tingmann
  1068. '' fix END statement problem when running from DOEXEC (in QUIT sub)
  1069. '' 
  1070. ''    Rev 1.4   15 Feb 1994 15:01:38   mmeth
  1071. '' added pvcs line for toolkit.lss &
  1072. ''
  1073. ''   Creation Date: Wednesday January 5, 1994
  1074. ''
  1075. ''   Copyright Lotus Development Corporation, (c) 1994
  1076. ''
  1077. ''
  1078. ''   Description:
  1079. ''      
  1080. ''
  1081. ''   Additional authors: MZ
  1082. ''
  1083. ''   Change History:
  1084. ''----------------------------------------------------------------------
  1085. ''   Date     Vers. Pgmr  SPR#  Change
  1086. ''----------------------------------------------------------------------
  1087. '' 02-16-94   0032  MZ         Added Lot_AreAnyNodeOptAvailToSrv()
  1088. ''!
  1089. '' 02-16-94   0031  TQI           Fix exit problem when calling QUIT during DOEXEC
  1090. '' 02-14-94   0030  MZ          Added Lot_IsAnyNodeOptAvailToNode() and
  1091. ''                              Lot_AreNodeOptAvailToNodeForProd()
  1092. ''                              Lot_GetNumOfNodeOptAvailToNodeForProd()
  1093. '' 02-11-94   0029  MZ          Added Lot_SaveTheNodeOptionsInInstallIni(),
  1094. ''                              Lot_GetLastNodeOptNumber() and
  1095. ''                              Lot_IsTheNodeOptionsAvailToNode() functions
  1096. '' 02-07-94   0028  MZ          move Lot_SaveFeaturesInstaledInInstallIni()
  1097. ''                              and Lot_GetLastFeatureNumber() from share.lss
  1098. '' 02-06-94   0027  MMETH       fixed Lot_Toggle... and MsgBox-> MessageB
  1099. '' 02-04-94   0026  MMETH       Added defaults for Reg DB.
  1100. '' 02-03-94   0025  MMETH       added Lot_WhereIsFeature also moved 
  1101. ''                              Lot_IstheFeatureInstall from toolkit.lss
  1102. '' 02-01-94   0024  MZ          ADDED Lot_GetGroupName and set
  1103. ''                              Prods(gCurrNumOfProds%).ProgManagerGroup="Lotus Applications"
  1104. '' 02-01-94   0024  MMETH       INSTALL_SOURCE still coming up empty.
  1105. '' 01-31-94   0023  MMETH       Cleaned up CallProductFunctions and Back
  1106. '' 01-30-94   0022  MMETH       Removed CreateCOuntDir from remmed out code
  1107. '' 01-28-94   0021  MZ          Add:Reg_SetLicenseSelected
  1108. ''                                  Reg_IsLicenseSelected
  1109. ''                                  Reg_SetCountDirectory
  1110. ''                                  Reg_GetCountDirectory
  1111. ''                                  Reg_SetBillboardNumber
  1112. ''                                  Reg_GetBillboardNumber
  1113. ''                              Change Reg_RegisterProductNames to set the 
  1114. ''                              BillboardNumber to 0
  1115. '' 01-28-94   0022  MMETH       Fixed CallProducts for "BACK"
  1116. '' 01-28-94   0021  DND         Added Reg_GetSystemFileSize and
  1117. ''                              Reg_SetSystemFileSize.
  1118. '' 01-27-94   0020  DND         Lot_GetChapterValStr returns empty
  1119. ''                              string if chapter is not found.
  1120. '' 01-25-94   0019  DND         Move SetRestartDir, RestartListEmpty,
  1121. ''                              and ExitExecRestart from setupapi.
  1122. '' 01-25-94   0018  MMETH       Added Lot_TrimEndSlash
  1123. '' 01-24-94   0017  MMETH       Fix GetTheRealProdDir
  1124. '' 01-24-94   0016  TQI         Capture function returns (lsi36)
  1125. '' 01-24-94   0015  MMETH       Move GetTheRealProd from share.lss
  1126. ''                              added prodno% parm, and modified implememntaion
  1127. '' 01-21-94   0014  MMETH       Added Parms to Lot_CallProducts
  1128. '' 01-20-94   0013  DND         CheckForSpace no longer pops modeless
  1129. '' 01-20-94   0012  MZ          Modify Reg_SetSelectedInstallType() to set to 
  1130. ''                              complete if custom and/or laptop is not a
  1131. ''                              valid choice for the product.
  1132. '' 01-19-94   0011  DND         Modified the GetFirstDrive functions so
  1133. ''                              they now return with the default dir.
  1134. ''                              Made the AllDrive function more effecient.
  1135. '' 01-19-94   0010  MMETH       Changed CallProd family to use Reg_GetProductAcronym
  1136. '' 01-19-94   0009  MZ          Change TRUE/FALSE to 1/0 in Reg_* SUB/FUNCs
  1137. '' 01-19-94   0009  MMeth       Use SYM_UPDATELIST$. 
  1138. ''                              Added Reg_GetNumberOfProducts.
  1139. '' 01-19-94   0008  DND         Lot_Get/SetCurrentProduct saves and returns
  1140. ''                              an integer. This makes life much easier
  1141. ''                              for toolkit. Changed 
  1142. ''                              Reg_SetSelectedInstallTypes to
  1143. ''                              Reg_SetSelectedInstallType. Fixed 
  1144. ''                              SelectDriveCombo to accept a path.
  1145. ''                              Lot_ExtractDriveLetter returns lower case.
  1146. '' 01-19-94   0008  TQI         Use doexec instead of execute
  1147. '' 01-18-94   0007  MZ          move Lot_CleanPath() to setupapi.lss
  1148. '' 01-18-94   0006  MZ          Put in the Product registration database
  1149. '' 01-18-94   0005  DND         Added Lot_CleanPath
  1150. '' 01-12-94   0004  MMETH       Changed Return code of CallProd to string
  1151. '' 01-12-94   0003  mmeth            Lot_CallProductFunctions (func_name$, always%, parms$)
  1152. '' 01-12-94   0002  tqi         option declare
  1153. '' 01-10-94   0001  MZ          Make all symbols Constants and put them
  1154. ''                              in GLOBALS.LSS
  1155. '' 01-05-94   0000  DND         Initial checkin
  1156. ''----------------------------------------------------------------------
  1157. ''
  1158. ''**********************************************************************
  1159.  
  1160. 'USE "SETUPAPI"
  1161. USE "START"
  1162. USE "REGISTER"
  1163. OPTION DECLARE
  1164. '************ User messages
  1165.  
  1166. PUBLIC CONST WM_COMMAND        = 273
  1167. PUBLIC CONST WM_USER           = 1024
  1168. PUBLIC CONST UM_PAINTMODELESS  = (WM_USER+1000)
  1169. PUBLIC CONST UM_REBOOTFLAG     = (WM_USER+503)
  1170. PUBLIC CONST UM_RESTARTWINDOWS = (WM_USER+504)
  1171.  
  1172.  
  1173. '** Return codes for drive type
  1174. PUBLIC CONST DRIVE_REMOVABLE = 2
  1175. PUBLIC CONST DRIVE_FIXED     = 3
  1176. PUBLIC CONST DRIVE_REMOTE    = 4
  1177.  
  1178. '** Function return codes
  1179. PUBLIC CONST SUCCESS = 1
  1180. PUBLIC CONST FAILURE = 0
  1181. PUBLIC CONST MANotes = 1   '** used in ModifyAutoexec
  1182. PUBLIC CONST MAShare = 2   '** used in ModifyAutoexec
  1183.  
  1184. '** These numbers must match those in lcomstf\sections.h of lcomstf.dll!!
  1185. PUBLIC CONST F_NOTHING    = 0
  1186. PUBLIC CONST F_CHAPTER    = 1
  1187. PUBLIC CONST F_NAME       = 2
  1188. PUBLIC CONST F_INOROUT    = 4
  1189. PUBLIC CONST F_DISPLAY    = 8
  1190. PUBLIC CONST F_COMPLETE   = 16
  1191. PUBLIC CONST F_LAPTOP     = 32
  1192. PUBLIC CONST F_CUSTOM     = 64
  1193. PUBLIC CONST F_TIPS       = 128
  1194. PUBLIC CONST F_HELP       = 256
  1195. PUBLIC CONST F_DESTDIR    = 512
  1196. PUBLIC CONST F_BITMAP     = 1024
  1197. PUBLIC CONST F_EXCEPTION  = 2048
  1198. PUBLIC CONST F_SHARE      = 4096
  1199. PUBLIC CONST F_KEYWORD    = 8192
  1200. PUBLIC CONST F_DESTDIRSYM = 16384
  1201.  
  1202. PUBLIC CONST RT_BITMAP  = 2     'This should be a MAKEINTRESOURCE(2) really
  1203. PUBLIC CONST RT_DIALOG  = 5     'This should be a MAKEINTRESOURCE(5) really
  1204. PUBLIC CONST RT_STRING  = 6     'This should be a MAKEINTRESOURCE(6) really
  1205.  
  1206. 'The decorated name for the generic dialog procedure in dlgproc.c  JMD
  1207. PUBLIC CONST FNAMEORGDLGPROC$="_FNameOrgDlgProc@16"
  1208.  
  1209. 'needed in callbacks
  1210. PUBLIC CONST MAX_NO_DRIVECOMBOS = 4
  1211.  
  1212. '*****
  1213. 'NEEDED FOR THE ARRAY CINSTALL
  1214. DECLARE SUB PopulateCINSTALLLIST
  1215. DIM CINSTALL LIST AS STRING
  1216. DIM gNCINSTALL%
  1217.  
  1218. 'NEEDED FOR THE ARRAY CINSTNODE
  1219. DECLARE SUB PopulateCINSTNODELIST
  1220. DIM CINSTNODE LIST AS STRING
  1221. DIM gNCINSTNODE%
  1222.  
  1223. 'NEEDED FOR THE ARRAY COBJECT
  1224. DECLARE SUB PopulateCOBJECTLIST(iniPath$)
  1225. DIM COBJECT LIST AS INTEGER
  1226. DIM gNCOBJECT%
  1227.         
  1228. %rem
  1229.  Moved to register.lss
  1230. '******************** Product Registration  struc, array and count *********
  1231. TYPE PRODINFO
  1232.    Acronym                    AS STRING
  1233.    Name                       AS STRING
  1234.    Complete                   AS INTEGER
  1235.    Custom                     AS INTEGER
  1236.    Laptop                     AS INTEGER
  1237.    SelectedType               AS STRING
  1238.    UIInOrOut                  AS INTEGER
  1239.    AllowUserToPickInSuite     AS INTEGER
  1240.    FullSize                   AS LONG
  1241.    MinSize                    AS LONG
  1242.    Share                      AS INTEGER
  1243.    Share32                    AS INTEGER
  1244.    DataLens                   AS INTEGER
  1245.    SQL                        AS INTEGER
  1246.    Paradox                    AS INTEGER
  1247.    CDOpt                      AS STRING
  1248.    CDOptSelected              AS STRING
  1249.    CDOptDefaultSelected       AS STRING
  1250.    NodeOpt                    AS STRING
  1251.    NodeOptSelected            AS STRING
  1252.    NodeOptDefaultSelected     AS STRING
  1253.    Srv                        AS INTEGER
  1254.    Dist                       AS INTEGER
  1255.    ExtraProdDirsNum           AS INTEGER
  1256.    License                    AS INTEGER
  1257.    LicenseSelected            AS INTEGER
  1258.    CountDirectory             AS STRING
  1259.    ATM                        AS INTEGER
  1260.    DirSymList                 AS STRING         'Should be populated in Init
  1261.    ProgManagerGroup           AS STRING
  1262.     ProgFolder                                              AS STRING
  1263.    SystemFileSize             AS LONG
  1264.    BillboardNumber            AS INTEGER
  1265.    SHAREEXE                   AS INTEGER
  1266.    Notes                      AS INTEGER
  1267.    PreviousVersion            AS STRING      'This is a string for future purposes
  1268.    MoreDirsCBName             AS STRING
  1269.    MoreDirsDlgID              AS INTEGER
  1270.    MoreDirsHlpID              AS LONG
  1271.    ObsoleteFiles              AS INTEGER      'This is can be a string for future enhancements
  1272. END TYPE
  1273.  
  1274. DIM Prods(gMaxNumOfProds) AS PRODINFO  
  1275. DIM gCurrNumOfProds%                      '** Number of products
  1276. DIM gCurrentProduct%                      '** The current product
  1277. %endrem
  1278.  
  1279. '******************** Lotus DLL interface **************************
  1280.  
  1281. DECLARE PUBLIC FUNCTION FIsKeywordInCopyList LIB "lcomstf.dll" ALIAS "_FIsKeywordInCopyList@4" (ByVal szKeyword$) AS LONG
  1282. DECLARE PUBLIC FUNCTION FGetChapterFromKeyword LIB "lcomstf.dll" ALIAS "_FGetChapterFromKeyword@12" (ByVal szKeyword$, ByVal szChptname$, ByVal cbChptsize&) AS LONG
  1283. DECLARE PUBLIC FUNCTION FRemoveDir LIB "lcomstf.dll" ALIAS "_FRemoveDir@4" (ByVal szDir$) AS LONG
  1284. DECLARE PUBLIC FUNCTION FOpenInf LIB "lcomstf.dll" ALIAS "_FOpenInf@12" (ByVal szFile$,ByVal fCheck&,ByVal fCheckSyms&) AS LONG
  1285. DECLARE PUBLIC FUNCTION LcbGetChapterCost LIB "lcomstf.dll" ALIAS "_LcbGetChapterCost@16" (ByVal szchapter$,ByVal szextra$,ByVal szcost$, ByVal szneed$) AS LONG
  1286. DECLARE PUBLIC FUNCTION CbGetInfSectionKeyField LIB "lcomstf.dll" ALIAS "_CbGetInfSectionKeyField@20" (ByVal szSect$, ByVal szKey$, ByVal iField&, ByVal szBuf$, ByVal cbBuf&) AS LONG
  1287. DECLARE PUBLIC FUNCTION FMakeListInfSectionField LIB "lcomstf.dll" ALIAS "_FMakeListInfSectionField@12" (ByVal szSym$, ByVal szSect$, ByVal iField&) AS LONG
  1288. DECLARE PUBLIC FUNCTION FSetSymbolToListOfInfKeys LIB "lcomstf.dll" ALIAS "_FSetSymbolToListOfInfKeys@12" (ByVal szSym$, ByVal szSect$, ByVal fNulls&) AS LONG
  1289. DECLARE PUBLIC FUNCTION FAddSectionFilesToCopyList LIB "lcomstf.dll" ALIAS "_FAddSectionFilesToCopyList@12" (ByVal szSect$, ByVal szSrc$, ByVal szDest$) AS LONG
  1290. DECLARE PUBLIC FUNCTION FAddSectionKeyFileToCopyList LIB "lcomstf.dll" ALIAS "_FAddSectionKeyFileToCopyList@16" (ByVal szSect$, ByVal szKey$, ByVal szSrc$, ByVal szDest$) AS LONG
  1291. DECLARE PUBLIC FUNCTION FDumpCopyListToFile LIB "lcomstf.dll" ALIAS "_FDumpCopyListToFile@4" (ByVal szFile$) AS LONG
  1292. DECLARE PUBLIC SUB      ResetCopyList LIB "lcomstf.dll" ALIAS "_ResetCopyList@0" ()
  1293. DECLARE PUBLIC SUB      ResetFileCosts LIB "lcomstf.dll" ALIAS "_ResetFileCosts@0" ()
  1294. DECLARE PUBLIC FUNCTION FRemoveSectionFilesFromCopyList LIB "lcomstf.dll" ALIAS "_FRemoveSectionFilesFromCopyList@4" (ByVal szSect$) AS LONG
  1295. DECLARE PUBLIC FUNCTION FRemoveSectionKeyFileFromCopyList LIB "lcomstf.dll" ALIAS "_FRemoveSectionKeyFileFromCopyList@8" (ByVal szSect$, ByVal szKey$) AS LONG
  1296. DECLARE PUBLIC FUNCTION FSetBeepingMode LIB "lcomstf.dll" ALIAS "_FSetBeepingMode@4" (ByVal mode&) AS LONG
  1297. DECLARE PUBLIC SUB      ProSetPos LIB "lcomstf.dll" ALIAS "_ProSetPos@8" (ByVal x&, ByVal y&)
  1298. DECLARE PUBLIC FUNCTION GrcCopyFilesInCopyList LIB "lcomstf.dll" ALIAS "_GrcCopyFilesInCopyList@4" (ByVal hInstance&) AS LONG
  1299. DECLARE PUBLIC FUNCTION LcbGetCopyListCost LIB "lcomstf.dll" ALIAS "_LcbGetCopyListCost@12" (ByVal szExtraList$, ByVal szCostList$, ByVal szNeedList$) AS LONG
  1300. DECLARE PUBLIC FUNCTION FAddToBillboardList LIB "lcomstf.dll" ALIAS "_FAddToBillboardList@16" (ByVal szDll$, ByVal idDlg&, ByVal szProc$, ByVal lTicks&) AS LONG
  1301. DECLARE PUBLIC FUNCTION FClearBillboardList LIB "lcomstf.dll" ALIAS "_FClearBillboardList@0" () AS LONG
  1302. DECLARE PUBLIC FUNCTION SetCopyMode LIB "lcomstf.dll" ALIAS "_SetCopyMode@4" (ByVal fMode&) AS LONG
  1303. DECLARE PUBLIC FUNCTION GetCopyMode LIB "lcomstf.dll" ALIAS "_GetCopyMode@0" () AS LONG
  1304. DECLARE PUBLIC FUNCTION SetSizeCheckMode LIB "lcomstf.dll" ALIAS "_SetSizeCheckMode@4" (ByVal scmMode&) AS LONG
  1305. DECLARE PUBLIC FUNCTION LcbGetInfSectionSize LIB "lcomstf.dll" ALIAS "_LcbGetInfSectionSize@4" (ByVal szSect$)  AS LONG
  1306. DECLARE PUBLIC FUNCTION FSetSilent LIB "lcomstf.dll" ALIAS "_FSetSilent@4" (ByVal mode&) AS LONG
  1307. DECLARE PUBLIC FUNCTION ReadSerialNumber LIB "lcomstf.dll" ALIAS "_ReadSerialNumber@8" (ByVal szSrc$,ByVal szSerial$) AS LONG
  1308. DECLARE PUBLIC FUNCTION WriteUserRegistration LIB "lcomstf.dll" ALIAS "_WriteUserRegistration@16" (ByVal szRi$,ByVal szUser$,ByVal szCompany$,ByVal szSerial$) AS LONG
  1309. DECLARE PUBLIC FUNCTION ReadUserRegistration LIB "lcomstf.dll" ALIAS "_ReadUserRegistration@16" (ByVal szRi$,ByVal szUser$,ByVal szCompany$,ByVal szSerial$) AS LONG
  1310. DECLARE PUBLIC FUNCTION FPopulateLCB LIB "lcomstf.dll" ALIAS "_FPopulateLCB@8" (ByVal hDlg&,ByVal Chapter$) AS LONG
  1311. DECLARE PUBLIC FUNCTION FSetDateOfFile LIB "lcomstf.dll" ALIAS "_FSetDateOfFile@8" (ByVal szFile$,ByVal szDate$) AS LONG
  1312. DECLARE PUBLIC FUNCTION FGetFirstChild LIB "lcomstf.dll" ALIAS "_FGetFirstChild@12" (ByVal szChapter$,ByVal szFirsthapter$, ByVal nField&) AS LONG
  1313. DECLARE PUBLIC FUNCTION FGetFirst LIB "lcomstf.dll" ALIAS "_FGetFirst@12" (ByVal szChapter$,ByVal szFirsthapter$, ByVal nField&) AS LONG
  1314. DECLARE PUBLIC FUNCTION FGetChapterValStr LIB "lcomstf.dll" ALIAS "_FGetChapterValStr@16" (ByVal szChapter$,ByVal nField&, ByVal szBuf$,ByVal cbBuf&) AS LONG
  1315. DECLARE PUBLIC FUNCTION FGetChapterValInt LIB "lcomstf.dll" ALIAS "_FGetChapterValInt@12" (ByVal szChapter$,ByVal nField&, lpVal&) AS LONG
  1316. DECLARE PUBLIC FUNCTION FGetNextSibling LIB "lcomstf.dll" ALIAS "_FGetNextSibling@12" (ByVal szChapter$,ByVal szNextChapter$,ByVal nField&) AS LONG
  1317. DECLARE PUBLIC FUNCTION FGetNextChild LIB "lcomstf.dll" ALIAS "_FGetNextChild@4" (ByVal szNextChildChapter$) AS LONG
  1318. DECLARE PUBLIC FUNCTION FGetNext LIB "lcomstf.dll" ALIAS "_FGetNext@4" (ByVal szNextChapter$) AS LONG
  1319. DECLARE PUBLIC FUNCTION FToggleChapterFilesInCopyList LIB "lcomstf.dll" ALIAS "_FToggleChapterFilesInCopyList@4" (ByVal szChapter$) AS LONG
  1320. DECLARE PUBLIC FUNCTION LcbGetInfChapterSize LIB "lcomstf.dll" ALIAS "_LcbGetInfChapterSize@4" (ByVal szChapter$)  AS LONG
  1321. DECLARE PUBLIC FUNCTION FInitializeCopyList LIB "lcomstf.dll" ALIAS "_FInitializeCopyList@12" (ByVal szChpt$, ByVal szSourcedir$, ByVal nField&) AS LONG
  1322. DECLARE PUBLIC FUNCTION FRefreshDestination LIB "lcomstf.dll" ALIAS "_FRefreshDestination@4" (ByVal lpszSym$) AS LONG 
  1323. DECLARE PUBLIC FUNCTION FWriteDestinationSymAndVal LIB "lcomstf.dll" ALIAS "_FWriteDestinationSymAndVal@8" (ByVal lpszIniFile$,ByVal lpszIniSec$) AS LONG 
  1324. DECLARE PUBLIC FUNCTION FSetRestartDir LIB "lcomstf.dll" ALIAS "_FSetRestartDir@4" (ByVal szDir$) AS LONG
  1325. DECLARE PUBLIC FUNCTION FRestartListEmpty LIB "lcomstf.dll" ALIAS "_FRestartListEmpty@0" () AS LONG
  1326. DECLARE PUBLIC FUNCTION FExitExecRestart LIB "lcomstf.dll" ALIAS "_FExitExecRestart@0" () AS LONG
  1327. DECLARE PUBLIC FUNCTION Lot_CreateConsoleProcess LIB "lcomstf.dll" ALIAS "_Lot_CreateConsoleProcess@8" (ByVal lpExeName$, ByVal lpCommandLine$) AS INTEGER
  1328. DECLARE PUBLIC FUNCTION FGetSectionFileList LIB "lcomstf.dll" ALIAS "_FGetSectionFileList@12" (ByVal lpszSym$, ByVal lpszSection$, ByVal RenameFlag%) AS INTEGER
  1329.  
  1330. '****************  Tabs UI Declarations  *********************************
  1331.  
  1332. DECLARE PUBLIC FUNCTION DriveType LIB "mscuistf.dll" ALIAS "_DriveType@4" (ByVal drivetype&) AS LONG
  1333. DECLARE PUBLIC FUNCTION RegisterFunction LIB "mscuistf.dll"  ALIAS "_RegisterFunction@12" (ByVal sess&, ByVal modname$, ByVal fname$) AS INTEGER
  1334. DECLARE PUBLIC FUNCTION NotebookAddDlgPage LIB "mscuistf.dll" ALIAS "_NotebookAddDlgPage@24" (ByVal  hDlg&,_
  1335.     ByVal idNotebook&, ByVal  idDlg&, ByVal lpszDllName$, ByVal lpszDlgProc$,_
  1336.     ByVal lpszTab$) AS LONG
  1337. DECLARE PUBLIC FUNCTION FNotebookPageView LIB "mscuistf.dll" ALIAS "_FNotebookPageView@16" (ByVal hDlg&,_
  1338.           ByVal idNotebook&, ByVal  idDlg&, ByVal fShowPage&) AS LONG
  1339. DECLARE PUBLIC FUNCTION FNotebookTurnToPage LIB "mscuistf.dll" ALIAS "_FNotebookTurnToPage@12" (ByVal hDlg&,ByVal idNotebook&,ByVal id&) AS LONG
  1340. DECLARE PUBLIC FUNCTION NotebookGetPageHwnd LIB "mscuistf.dll" ALIAS "_NotebookGetPageHwnd@12" (ByVal hDlg&,ByVal idNotebook&,ByVal idPage&) AS LONG
  1341. DECLARE PUBLIC SUB      LCBResetContent LIB "mscuistf.dll" ALIAS "_LCBResetContent@4" (ByVal hDlg&)
  1342. DECLARE PUBLIC SUB      LCBSetRedraw LIB "mscuistf.dll" ALIAS "_LCBSetRedraw@8" (ByVal hDlg&, ByVal fRedraw&)
  1343. DECLARE PUBLIC FUNCTION LCBGetCount LIB "mscuistf.dll" ALIAS "_LCBGetCount@4" (ByVal hDlg&) AS LONG
  1344. DECLARE PUBLIC FUNCTION LCBAddItem LIB "mscuistf.dll" ALIAS "_LCBAddItem@8" (ByVal hDlg&, ByVal item$) AS LONG
  1345. DECLARE PUBLIC FUNCTION LCBReplaceItem LIB "mscuistf.dll" ALIAS "_LCBReplaceItem@16" (ByVal hDlg&, ByVal index&, ByVal itemnum&, ByVal item$) AS LONG
  1346. DECLARE PUBLIC FUNCTION LCBGetItem LIB "mscuistf.dll" ALIAS "_LCBGetItem@20" (ByVal hDlg&, ByVal index&, ByVal itemnum&, ByVal item$, ByVal itemmax&) AS LONG
  1347. DECLARE PUBLIC FUNCTION LCBToggleItem LIB "mscuistf.dll" ALIAS "_LCBToggleItem@8" (ByVal hDlg&, ByVal index&) AS LONG
  1348. DECLARE PUBLIC SUB      LCBSetSel LIB "mscuistf.dll" ALIAS "_LCBSetSel@8" (ByVal hDlg&, ByVal index&) 
  1349. DECLARE PUBLIC SUB      LCBSetTabs LIB "mscuistf.dll" ALIAS "_LCBSetTabs@20" (ByVal hDlg&, ByVal t1&,ByVal t2&,ByVal t3&,ByVal t4&)
  1350. DECLARE PUBLIC FUNCTION FGetDriveFreeSpaceList LIB "mscuistf.dll" ALIAS "_FGetDriveFreeSpaceList@4" (ByVal szSymbol$) AS LONG
  1351.  
  1352. '** UNC stuff
  1353. DECLARE PUBLIC FUNCTION FAddToDriveFreeSpaceList LIB "mscuistf.dll" ALIAS "_FAddToDriveFreeSpaceList@8" (ByVal szSymbol$,ByVal szNewItem$) AS LONG
  1354. DECLARE PUBLIC FUNCTION FIsUnvalidatedUNCPath LIB "mscuistf.dll" ALIAS "_FIsUnvalidatedUNCPath@4" (ByVal szPath$) AS LONG
  1355. DECLARE PUBLIC FUNCTION FIsValidUNCPath LIB "mscuistf.dll" ALIAS "_FIsValidUNCPath@4" (ByVal szPath$) AS LONG
  1356. DECLARE PUBLIC FUNCTION FGetGroupName LIB "mscuistf.dll" ALIAS "_FGetGroupName@12" (ByVal szGroupFileName$, ByVal szBuf$,ByVal cbBuf&) AS LONG
  1357. DECLARE PUBLIC FUNCTION RemovePriorVersion(ProdRegKeyName$,ProdVer$) AS INTEGER
  1358.  
  1359. '*************** Wrappers for MS functions that Lotus re-wrote **************
  1360.  
  1361. DECLARE PUBLIC SUB      ReadInfFile (szFile$)
  1362. DECLARE PUBLIC SUB      MakeListFromSectionKeys (szSymbol$, szSect$)
  1363. DECLARE PUBLIC SUB      MakeListFromSectionDate (szSym$, szSect$)
  1364. DECLARE PUBLIC SUB      MakeListFromSectionFilename (szSym$, szSect$)
  1365. DECLARE PUBLIC SUB      MakeListFromSectionSize (szSym$, szSect$)
  1366. DECLARE PUBLIC SUB      MakeListFromSectionVersion (szSym$, szSect$)
  1367. DECLARE PUBLIC FUNCTION SetSilentMode (mode%) AS INTEGER
  1368. DECLARE PUBLIC FUNCTION SetBeepingMode (mode%) AS INTEGER
  1369. DECLARE PUBLIC FUNCTION GetSectionKeyDate (szSect$, szKey$) AS STRING
  1370. DECLARE PUBLIC FUNCTION GetSectionKeyFilename (szSect$, szKey$) AS STRING
  1371. DECLARE PUBLIC FUNCTION GetSectionKeySize (szSect$, szKey$) AS LONG
  1372. DECLARE PUBLIC FUNCTION GetSectionKeyVersion (szSect$, szKey$) AS STRING
  1373. DECLARE PUBLIC SUB      RemoveDir (szDir$, cmo%)
  1374. DECLARE PUBLIC SUB      DumpCopyList (szFile$)
  1375. DECLARE PUBLIC SUB      ClearCopyList
  1376. DECLARE PUBLIC FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) AS LONG
  1377. DECLARE PUBLIC SUB      CopyFilesInCopyList
  1378. DECLARE PUBLIC SUB      AddSectionFilesToCopyList (szSect$, szSrc$, szDest$)
  1379. DECLARE PUBLIC SUB      AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  1380. DECLARE PUBLIC SUB      AddToBillboardList (szDll$, idDlg&, szProc$, lTicks&)
  1381. DECLARE PUBLIC SUB      AddBlankToBillboardList (lTicks&)
  1382. DECLARE PUBLIC SUB      ClearBillboardList
  1383. DECLARE PUBLIC SUB      SetCopyGaugePosition (x%, y%)
  1384. DECLARE PUBLIC SUB      SetRestartDir(szDir$)
  1385. DECLARE PUBLIC FUNCTION RestartListEmpty AS INTEGER
  1386. DECLARE PUBLIC FUNCTION ExitExecRestart AS INTEGER
  1387.  
  1388. '** Utility functions
  1389.  
  1390. DECLARE PUBLIC FUNCTION GetAbsPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1391. DECLARE PUBLIC FUNCTION MakePath (szDir$, szFile$) AS STRING
  1392. DECLARE PUBLIC SUB      ShowPathError (nmsg%, nDescription%, szPath$)
  1393. DECLARE PUBLIC SUB      ShowPathErrorNoDlgExit (nmsg%, nDescription%, szPath$)
  1394. DECLARE PUBLIC FUNCTION IsPathWritable (szPath$) AS INTEGER
  1395. DECLARE PUBLIC FUNCTION ValidatePath (szPath$) AS INTEGER
  1396. DECLARE PUBLIC FUNCTION RegisterCallback (ReturnStr$, FuncName$) AS INTEGER
  1397. DECLARE PUBLIC FUNCTION PopupModalDlg (Dlg%, HelpID&) AS STRING
  1398. DECLARE PUBLIC FUNCTION PopupModelessDlg (Dlg%, HelpID&) AS STRING
  1399. DECLARE PUBLIC FUNCTION SelectDriveCombo (ComboID$, path$) AS INTEGER
  1400. DECLARE PUBLIC FUNCTION CheckForSpace (DlgId%) AS INTEGER
  1401. DECLARE PUBLIC SUB      QUIT
  1402. DECLARE PUBLIC SUB      Lot_WriteDestinationSymAndVal(IniFileName$,IniSection$) 
  1403. DECLARE PUBLIC SUB      Lot_WriteCriticalDirectories (InstallIniFile$)
  1404. DECLARE PUBLIC FUNCTION Lot_WriteToRiFile (ripath$) AS INTEGER
  1405. DECLARE PUBLIC FUNCTION Lot_ReadDefaultsfromRi (default_ripath$) AS INTEGER
  1406. DECLARE PUBLIC FUNCTION Lot_AreShareToolsSupported () AS INTEGER
  1407. DECLARE PUBLIC FUNCTION Lot_AreShare32ToolsSupported () AS INTEGER
  1408. DECLARE PUBLIC FUNCTION Lot_CallSharedTool (func$) AS INTEGER
  1409. DECLARE PUBLIC FUNCTION GetNotesPathfromLotusIni() AS STRING
  1410. DECLARE PUBLIC FUNCTION IsNotesInPath() AS INTEGER
  1411. DECLARE PUBLIC FUNCTION IsShareInAUTOEXEC() AS INTEGER
  1412. DECLARE PUBLIC FUNCTION ModifyAutoexec(modflag%,directmod%,backup$) AS STRING
  1413. DECLARE PUBLIC FUNCTION GetBootDrive() AS STRING
  1414. DECLARE PUBLIC FUNCTION Lot_GetLotusNotesDataPath() AS STRING
  1415. DECLARE PUBLIC FUNCTION Lot_GetORACLEHomePath() AS STRING
  1416. DECLARE PUBLIC FUNCTION Lot_GetLotusNotesPrgPath() AS STRING
  1417. 'DECLARE PUBLIC FUNCTION GetLotusNotesDataPath(szFile$, szSect$, szKey$) AS STRING
  1418. DECLARE PUBLIC SUB      DL_SetOraclePath
  1419. DECLARE PUBLIC SUB      DL_SetNotesDataPath
  1420. DECLARE PUBLIC FUNCTION TrimNetlotusapp (ByVal path$) AS STRING
  1421. DECLARE PUBLIC FUNCTION GetLastPathComponent( ByVal szPath$) AS STRING
  1422. DECLARE PUBLIC SUB ComboSelChanged(BoxNo&, Inst%)
  1423. DECLARE PUBLIC FUNCTION GetPathFromComboEdit(hDlg&,BoxNo%) AS STRING
  1424. DECLARE PUBLIC FUNCTION OneUp(s$) AS STRING
  1425.  
  1426.  
  1427. '** Lotus functions
  1428.  
  1429. DECLARE PUBLIC FUNCTION Lot_GetLocalHardDrive (ProdSize&,DefaultDir$) AS STRING
  1430. DECLARE PUBLIC FUNCTION Lot_GetNetHardDrive (ProdSize&,DefaultDir$) AS STRING
  1431. DECLARE PUBLIC FUNCTION Lot_GetAllHardDrive(ProdSize&,DefaultDir$) AS STRING
  1432. DECLARE PUBLIC FUNCTION Lot_Dir  (szDir$) AS STRING
  1433. DECLARE PUBLIC FUNCTION Lot_GetChapterFromKeyword (szKeyword$) AS STRING
  1434. DECLARE PUBLIC FUNCTION Lot_CallProductFunctions (func_name$, BYVAL direction$, always%, back$, parms$) AS STRING
  1435. DECLARE PUBLIC FUNCTION Lot_CallOneProductFunction (prodno%, func_name$, BYVAL direction$, always%, parms$) AS STRING
  1436. DECLARE PUBLIC FUNCTION Lot_CheckPath (path$) AS INTEGER
  1437. DECLARE PUBLIC FUNCTION Lot_GetInfSectionSize (szSect$)  AS LONG
  1438. DECLARE PUBLIC SUB      Lot_RemoveSectionFilesFromCopyList (szSect$)
  1439. DECLARE PUBLIC SUB      Lot_RemoveSectionKeyFileFromCopyList (szSect$, szKey$)
  1440. DECLARE PUBLIC FUNCTION Lot_SetDateOfFile (szFile$, szDate$) AS INTEGER
  1441. DECLARE PUBLIC FUNCTION Lot_GetFirst (szChapt$, nFlag%) AS STRING
  1442. DECLARE PUBLIC FUNCTION Lot_GetNext () AS STRING
  1443. DECLARE PUBLIC FUNCTION Lot_AddPagetoNotebook (hDlg&,  Notebookid&, DlgId%,Tabstring$) AS INTEGER
  1444. DECLARE PUBLIC FUNCTION Lot_NotebookPageView (hDlg&,  Notebookid&, DlgId%, fShowPage%) AS INTEGER
  1445. DECLARE PUBLIC SUB      Lot_TurnToPage (hDlg&,Notebookid&, pageid%) 
  1446. DECLARE PUBLIC FUNCTION Lot_GetPagehandle  (hDlg&,Notebookid&,Pageid%) AS LONG
  1447. DECLARE PUBLIC SUB      Lot_LCBResetContent     (hDlg&)
  1448. DECLARE PUBLIC SUB      Lot_LCBSetRedraw        (hDlg&, fRedraw%)
  1449. DECLARE PUBLIC FUNCTION Lot_LCBGetCount    (hDlg&) AS INTEGER
  1450. DECLARE PUBLIC FUNCTION Lot_LCBAddItem     (hDlg&, item$) AS INTEGER
  1451. DECLARE PUBLIC FUNCTION Lot_LCBReplaceItem (hDlg&, index%, itemnum%, item$) AS INTEGER
  1452. DECLARE PUBLIC FUNCTION Lot_LCBGetItem     (hDlg&, index%, itemnum%) AS STRING
  1453. DECLARE PUBLIC FUNCTION Lot_LCBToggleItem  (hDlg&, index%) AS INTEGER
  1454. DECLARE PUBLIC SUB      Lot_LCBSetSel           (hDlg&, index%)
  1455. DECLARE PUBLIC SUB      Lot_LCBSetTabs           (hDlg&, t1%,t2%,t3%,t4%)
  1456. DECLARE PUBLIC FUNCTION Lot_GetFirstChild (szChapt$, nFlag%) AS STRING
  1457. DECLARE PUBLIC FUNCTION Lot_GetChapterValStr (szChapter$, nField%) AS STRING  
  1458. DECLARE PUBLIC FUNCTION Lot_GetChapterValInt (szChapter$,nField%) AS INTEGER  
  1459. DECLARE PUBLIC FUNCTION Lot_GetNextSibling (szChapter$,nField%) AS STRING
  1460. DECLARE PUBLIC FUNCTION Lot_GetNextChild () AS STRING
  1461. DECLARE PUBLIC FUNCTION Lot_GetInfChapterSize (szChapter$)  AS LONG
  1462. DECLARE PUBLIC SUB      Lot_ToggleChapterFilesInCopyList (szChapter$)  
  1463. DECLARE PUBLIC FUNCTION Lot_SetChapterFilesInCopyListInOrOut (szChapter$, InOrOut%)  AS INTEGER
  1464. DECLARE PUBLIC SUB      Lot_InitializeCopyList (chpt$, nField%) 
  1465. DECLARE PUBLIC SUB      Lot_RefreshDestination (symbol$) 
  1466. DECLARE PUBLIC SUB      Lot_GetDriveFreeSpaceList (szSymbol$)
  1467. DECLARE PUBLIC FUNCTION Lot_GetSharedToolsSize() AS INTEGER
  1468. DECLARE PUBLIC FUNCTION Lot_GetShared32ToolsSize() AS INTEGER
  1469. DECLARE PUBLIC FUNCTION Lot_MakeSizeString (size AS LONG) AS STRING
  1470. DECLARE PUBLIC FUNCTION Lot_ExtractDriveLetter (destdir$) AS STRING
  1471. DECLARE PUBLIC FUNCTION Lot_ExtractDirectory (destdir$) AS STRING
  1472. DECLARE PUBLIC FUNCTION Lot_GetGroupName ( szGroupFileName$) AS STRING  
  1473. DECLARE PUBLIC FUNCTION Lot_IsTheFeatureInstalled(s$) AS INTEGER
  1474. DECLARE PUBLIC FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  1475. DECLARE PUBLIC FUNCTION Lot_GetDestDirValueFromInstallini(DestDirSym$) AS STRING
  1476. DECLARE PUBLIC SUB Lot_InitializeWinWinsysSym () 
  1477. DECLARE PUBLIC SUB Lot_InitializeEXTRA ()
  1478. DECLARE PUBLIC FUNCTION Lot_IsDestVerNewerOrEqual(DestinationPath$,SourceVer1&,SourceVer2&,SourceVer3&,SourceVer4&) AS INTEGER
  1479. DECLARE PUBLIC SUB      Lot_CallWinhelp32 (prodno%, network$, SectionName$, DestDirSym$, FileName$) 
  1480. DECLARE PUBLIC SUB Lot_FixupSourceDirectories
  1481. DECLARE PUBLIC SUB MarkFixupSourceDirSymbol(szSubdirSymbol$)
  1482. DECLARE PUBLIC FUNCTION Lot_RegIni(RegFileName$) AS INTEGER
  1483. DECLARE PUBLIC SUB Lot_RegisterFonts()
  1484. DECLARE PUBLIC FUNCTION Lot_RegisterTypeLib(ID$, Version$, Description$, helppath$, filename$, flags%) AS INTEGER
  1485. DECLARE PUBLIC SUB IncrementSharedDLLCount(s$)
  1486.  
  1487. '** UNC stuff
  1488. DECLARE PUBLIC SUB Lot_SplitUNCPath (szFullPath$, szVol$, szDirPath$)
  1489. DECLARE PUBLIC FUNCTION Lot_AddToDriveFreeSpaceList (szSymbol$, szNewItem$) AS LONG
  1490. DECLARE PUBLIC FUNCTION Lot_IsUnvalidatedUNCPath (szPath$) AS LONG
  1491. DECLARE PUBLIC FUNCTION Lot_IsValidUNCPath (szPath$) AS LONG
  1492. DECLARE PUBLIC FUNCTION FMapUNCVolume LIB "mscuistf.dll" ALIAS "_FMapUNCVolume@8" (ByVal szUNCRoot$, ByVal szDrive$) AS LONG
  1493. DECLARE PUBLIC FUNCTION FUnmapUNCVolume LIB "mscuistf.dll" ALIAS "_FUnmapUNCVolume@4" (ByVal szDrive$) AS LONG
  1494. DECLARE PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  1495. DECLARE PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  1496. '** end UNC stuff
  1497.  
  1498. 'Registration functions moved to REGISTER.LSS
  1499.  
  1500. DECLARE PUBLIC FUNCTION Lot_GetCurrentProduct() AS INTEGER
  1501. DECLARE PUBLIC SUB      Lot_SetCurrentProduct(ProdNo%) 
  1502. DECLARE PUBLIC FUNCTION Lot_GetInstallDir() AS STRING
  1503. DECLARE PUBLIC FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  1504. DECLARE PUBLIC FUNCTION Lot_Readserialnumber () AS INTEGER
  1505. DECLARE PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstallIni() AS INTEGER
  1506. DECLARE PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstNodeIni() AS INTEGER
  1507. DECLARE PUBLIC FUNCTION Lot_SaveTheNodeOptionsInInstallIni() AS INTEGER
  1508. DECLARE PUBLIC FUNCTION Lot_IsTheNodeOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  1509. DECLARE PUBLIC FUNCTION Lot_AreAnyNodeOptionsAvail() AS INTEGER
  1510. DECLARE PUBLIC FUNCTION Lot_IsAnyNodeOptAvailToNode()AS INTEGER
  1511. DECLARE PUBLIC FUNCTION Lot_AreNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  1512. DECLARE PUBLIC FUNCTION Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  1513. DECLARE PUBLIC FUNCTION Lot_AreAnyNodeOptAvailToSrv() AS INTEGER
  1514. DECLARE PUBLIC SUB Lot_TurnOffAllNodeOptSections()
  1515. DECLARE PUBLIC FUNCTION Lot_SaveTheCDOptionsInInstallIni() AS INTEGER
  1516. DECLARE PUBLIC FUNCTION Lot_IsTheCDOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  1517. DECLARE PUBLIC FUNCTION Lot_IsAnyCDOptAvailToNode()AS INTEGER
  1518. DECLARE PUBLIC FUNCTION Lot_AreCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  1519. DECLARE PUBLIC FUNCTION Lot_GetNumOfCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  1520. DECLARE PUBLIC FUNCTION Lot_AreAnyCDOptAvailToSrv() AS INTEGER
  1521.  
  1522. '** Win95 uninstaller functions
  1523. DECLARE PUBLIC FUNCTION Lot_RegisterUninstaller(ProdRegKeyName$,ProdVer$,_
  1524.                         ProdDisplayedName$,ProdInfPath$,_
  1525.                         LogFlag%,AutoFlag%,_
  1526.                         LangID$,LogFile$,RspFile$,_
  1527.                         UserName$ ) AS INTEGER
  1528. DECLARE PUBLIC FUNCTION Lot_RegisterObject(FeatureKeyWord$,ClassOfObject$,_
  1529.                         ObjectPath$)
  1530.  
  1531. '** Resource splitting functions
  1532.  
  1533. DECLARE PUBLIC FUNCTION FindResourceinDLL (idDlg&, ResType%) AS STRING
  1534.  
  1535. '** Local functions
  1536.  
  1537. DECLARE PUBLIC SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  1538. DECLARE FUNCTION Lot_GetLastFeatureNumber() AS INTEGER
  1539. DECLARE FUNCTION Lot_GetLastNodeOptNumber(s$) AS INTEGER
  1540. DECLARE FUNCTION Lot_GetLastCDOptNumber(s$) AS INTEGER
  1541. 'Don't make this generally available
  1542. DECLARE FUNCTION AddFontResource LIB "gdi32" alias "AddFontResourceA" (ByVal szFFile$) AS INTEGER
  1543.  
  1544. '** Local globals
  1545.  
  1546. PUBLIC gEndStatementEncountered% ' TRUE when END statement encountered
  1547.  
  1548. '**************************************************************************
  1549.  
  1550. SUB INITIALIZE
  1551. '** Purpose:   Sets the begining of the Product registration array
  1552. '** Arguments:
  1553. '*************************************************************************
  1554.  gCurrNumOfProds% = 0
  1555.  gCurrentProduct% = 1
  1556. ' Moved from main because of symbol initialization in early LdString calls
  1557.  
  1558.    ON Error STFQUIT    GOTO MAINERROR
  1559.    ON Error STFERR     GOTO STFERR_
  1560.    ON Error STFTOGGLE  GOTO STFTOGGLEERR
  1561.  
  1562.     ToolKitInitalizeError& = 0
  1563.     SetUpAPI
  1564.  
  1565.     EXIT SUB
  1566.  
  1567. MAINERROR:
  1568.     ToolKitInitalizeError& = STFQUIT
  1569.     EXIT SUB
  1570.         
  1571. STFERR_:
  1572.     ToolKitInitalizeError& = STFERR
  1573.     EXIT SUB
  1574.  
  1575. STFTOGGLEERR:
  1576.     ToolKitInitalizeError& = STFTOGGLE
  1577.  
  1578. END SUB
  1579.  
  1580. PUBLIC FUNCTION Lot_GetSharedToolsSize() AS INTEGER
  1581. '** Purpose:
  1582. '**     Gets the size of the shared tools in Kb
  1583. '** Arguments:
  1584. '** Returns:
  1585. '**     the size or 0
  1586. '*************************************************************************
  1587.    DIM CurrChpt$, SharedID$, ShareSize&
  1588.  
  1589.    CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  1590.    WHILE (CurrChpt$ <> "")
  1591.       SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  1592.       IF SharedID$="IVCPROGRAM" OR _
  1593.      SharedID$="CONTAINERFILEPROGRAM" OR _
  1594.      SharedID$="DATALENSPROGRAM" OR _
  1595.      SharedID$="DATALENSDATA" OR _
  1596.      SharedID$="DIALOGEDITORPROGRAM" OR _
  1597.      SharedID$="DESKTOP" OR _
  1598.      SharedID$="DOCUMENTFILEFILTERSPROGRAM" OR _
  1599.      SharedID$="DOCUMENTFILEFILTERSFILTER" OR _
  1600.      SharedID$="GRAMMARCHECKERPROGRAM" OR _
  1601.      SharedID$="GRAMMARCHECKERDATA" OR _
  1602.      SharedID$="GRAPHICFILEFILTERSPROGRAM" OR _
  1603.      SharedID$="HYPHENATIONPROGRAM" OR _
  1604.      SharedID$="HYPHENATIONDATA" OR _
  1605.      SharedID$="ICONPALETTEPROGRAM" OR _
  1606.      SharedID$="INFOBOXPROGRAM" OR _
  1607.      SharedID$="SCRIPTPROGRAM" OR _
  1608.      SharedID$="MULTIMEDIAPROGRAM" OR _
  1609.      SharedID$="MULTIMEDIADATA" OR _
  1610.      SharedID$="SPELLCHECKERPROGRAM" OR _
  1611.      SharedID$="SPELLCHECKERDATA" OR _
  1612.      SharedID$="SPELLCHECKERUSER" OR _
  1613.      SharedID$="STATUSBARPROGRAM" OR _
  1614.      SharedID$="THESAURUSPROGRAM" OR _
  1615.      SharedID$="THESAURUSDATA" OR _
  1616.      SharedID$="TOOLSPROGRAM" OR _
  1617.      SharedID$="TOOLSDATA" OR _
  1618.      SharedID$="USERNAMESERVICESPROGRAM" OR _
  1619.      SharedID$="FILTERS" OR _
  1620.      SharedID$="EXCELFLT" THEN
  1621.      
  1622.         ShareSize& = ShareSize&+Lot_GetInfChapterSize(CurrChpt$)
  1623.  
  1624.       END IF
  1625.  
  1626.       CurrChpt$ = Lot_GetNext() 
  1627.  
  1628.    WEND
  1629.  
  1630.    Lot_GetSharedToolsSize = INT(ShareSize&/1024)
  1631.  
  1632. 'testint% = INT(ShareSize& / 1024)
  1633. 'Lot_GetSharedToolsSize = testint%
  1634. 'DoMsgBox("testint%", STR$(testint%), MB_OK)
  1635.  
  1636. END FUNCTION
  1637.  
  1638.  
  1639. PUBLIC FUNCTION Lot_GetShared32ToolsSize() AS INTEGER
  1640. '** Purpose:
  1641. '**     Gets the size of the shared tools for Win32 in Kb
  1642. '** Arguments:
  1643. '** Returns:
  1644. '**     the size or 0
  1645. '*************************************************************************
  1646.    DIM CurrChpt$, SharedID$, ShareSize&
  1647.  
  1648.    CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  1649.    WHILE (CurrChpt$ <> "")
  1650.       SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  1651.       IF SharedID$="WIN32IVCPROGRAM" OR _
  1652.      SharedID$="WIN32CONTAINERFILEPROGRAM" OR _
  1653.      SharedID$="WIN32DATALENSPROGRAM" OR _
  1654.      SharedID$="WIN32DATALENSDATA" OR _
  1655.      SharedID$="WIN32DIALOGEDITORPROGRAM" OR _
  1656.      SharedID$="WIN32DESKTOP" OR _
  1657.      SharedID$="WIN32DOCUMENTFILEFILTERSPROGRAM" OR _
  1658.      SharedID$="WIN32DOCUMENTFILEFILTERSFILTER" OR _
  1659.      SharedID$="WIN32GRAMMARCHECKERPROGRAM" OR _
  1660.      SharedID$="WIN32GRAMMARCHECKERDATA" OR _
  1661.      SharedID$="WIN32GRAPHICFILEFILTERSPROGRAM" OR _
  1662.      SharedID$="WIN32HYPHENATIONPROGRAM" OR _
  1663.      SharedID$="WIN32HYPHENATIONDATA" OR _
  1664.      SharedID$="WIN32ICONPALETTEPROGRAM" OR _
  1665.      SharedID$="WIN32INFOBOXPROGRAM" OR _
  1666.      SharedID$="WIN32SCRIPTPROGRAM" OR _
  1667.      SharedID$="WIN32MULTIMEDIAPROGRAM" OR _
  1668.      SharedID$="WIN32MULTIMEDIADATA" OR _
  1669.      SharedID$="WIN32SPELLCHECKERPROGRAM" OR _
  1670.      SharedID$="WIN32SPELLCHECKERDATA" OR _
  1671.      SharedID$="WIN32SPELLCHECKERUSER" OR _
  1672.      SharedID$="WIN32STATUSBARPROGRAM" OR _
  1673.      SharedID$="WIN32THESAURUSPROGRAM" OR _
  1674.      SharedID$="WIN32THESAURUSDATA" OR _
  1675.      SharedID$="WIN32TOOLSPROGRAM" OR _
  1676.      SharedID$="WIN32TOOLSDATA" OR _
  1677.      SharedID$="WIN32USERNAMESERVICESPROGRAM" OR _
  1678.      SharedID$="WIN32FILTERS" OR _
  1679.      SharedID$="WIN32EXCELFLT" THEN
  1680.      
  1681.         ShareSize& = ShareSize&+Lot_GetInfChapterSize(CurrChpt$)
  1682.  
  1683.       END IF
  1684.  
  1685.       CurrChpt$ = Lot_GetNext() 
  1686.  
  1687.    WEND
  1688.  
  1689.    Lot_GetShared32ToolsSize = INT(ShareSize&/1024)
  1690.  
  1691. 'testint% = INT(ShareSize& / 1024)
  1692. 'Lot_GetSharedToolsSize = testint%
  1693. 'DoMsgBox("testint%", STR$(testint%), MB_OK)
  1694.  
  1695. END FUNCTION
  1696.  
  1697.  
  1698. '*********************************************************
  1699.  
  1700. PUBLIC FUNCTION GetAbsPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1701. '** Purpose: This function is called whenever we need to retrieve a string
  1702. '**           from .ini file. Function returns a clean path (path returned from
  1703. '**           FCleanFatPath.    
  1704. '** Author:    JKK
  1705. '** Arguments:  Name of the .ini file, section name in the .ini file, key we
  1706. '**             are searching for and two integer flags, nullflag% & invalidpath%.
  1707. '**             Function puts up two error messages based on the value of nullflag%, and 
  1708. '**             invalidpath. 
  1709. '** Returns:   Function either returns null or the value of the string.
  1710. '**     
  1711. '*************************************************************************
  1712.   DIM rstring$, rv%, errText$
  1713.  
  1714.    GetAbsPathFromIni = ""
  1715.    rstring$ = GetIniKeyString(szFile$, szSect$, szKey$)
  1716.    If rstring$ <> "" Then
  1717.  
  1718.       rv% = Lot_CleanPath(rstring$)
  1719.  
  1720.       'tqi - I believe this trim should no longer be necessary, but no harm to leave it 
  1721.       errText$ =  NullTrim(szFile$)
  1722.       if rv% <> 0 Then
  1723.      GetAbsPathFromIni = rstring$
  1724.       elseif invalidpathflag% <> FALSE then
  1725.  
  1726.      ErrorMsg SID_ERR_GETINIKEYSTRING, errText$
  1727.      ERROR STFQUIT
  1728.  
  1729.       end if 
  1730.  
  1731.    elseif nullflag% <> FALSE then
  1732.  
  1733.       ErrorMsg SID_ERR_GETINIKEYSTRING, errText$
  1734.       ERROR STFQUIT
  1735.  
  1736.    else
  1737.       GetAbsPathFromIni = ""
  1738.    end if
  1739.  
  1740. END FUNCTION
  1741.  
  1742. PUBLIC FUNCTION MakePath (szDir$, szFile$) AS STRING
  1743. '** Purpose:
  1744. '**     Appends a file name to the end of a directory path,
  1745. '**     inserting a backslash character as needed.
  1746. '** Arguments:
  1747. '**     szDir$  - full directory path (with optional ending "\")
  1748. '**     szFile$ - filename to append to directory
  1749. '** Returns:
  1750. '**     Resulting fully qualified path name. (Lower Case)
  1751. '*************************************************************************
  1752.    DIM sz$
  1753.  
  1754.    IF szDir$ = "" THEN
  1755.       sz$ = szFile$
  1756.    ELSEIF szFile$ = "" THEN
  1757.       sz$ = szDir$
  1758.    ELSEIF LENBP(szFile$) > 12 THEN
  1759.       IF LENBP(szFile$) = 13 AND RIGHT$(szFile$,1) = "\" THEN
  1760.       sz$ = szDir$ + szFile$
  1761.       ELSE      
  1762. '       sz$ = ""
  1763.             sz$ = szDir$ + "\" + szFile$
  1764.       END IF
  1765.    ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1766.       sz$ = szDir$ + szFile$
  1767.    ELSE
  1768.       sz$ = szDir$ + "\" + szFile$
  1769.    END IF
  1770.  
  1771.    IF sz$ <> "" THEN
  1772.       MakePath = LCASE$(sz$)
  1773.    ELSE
  1774.       MakePath = sz$
  1775.    END IF
  1776.  
  1777.     
  1778.  
  1779. END FUNCTION
  1780.  
  1781. PUBLIC FUNCTION Lot_MakeSizeString(size&) AS STRING
  1782. '** Purpose:
  1783. '** Author:
  1784. '** Arguments:
  1785. '** Returns:
  1786. '**     
  1787. '*************************************************************************
  1788.    Lot_MakeSizeString = STR$(size&) + gStrK$
  1789. END FUNCTION
  1790. '*************************************************************************
  1791.  
  1792. PUBLIC FUNCTION Lot_ExtractDriveLetter(destdir$) AS STRING
  1793. '** Purpose:
  1794. '** Author:
  1795. '** Arguments:
  1796. '** Returns:
  1797. '**     
  1798. '*************************************************************************
  1799.   Lot_ExtractDriveLetter = LCASE$(MID$(destdir$, 1, 1))
  1800. END FUNCTION
  1801. '*************************************************************************
  1802.  
  1803. PUBLIC FUNCTION Lot_ExtractDirectory(destdir$) AS STRING
  1804. '** Purpose:
  1805. '** Author:
  1806. '** Arguments:
  1807. '** Returns:
  1808. '**     
  1809. '*************************************************************************
  1810.   Lot_ExtractDirectory = LCASE$(MID$(destdir$, 3))
  1811. END FUNCTION
  1812. '*************************************************************************
  1813. PUBLIC SUB      Lot_CallWinhelp32 (prodno%, network$, SectionName$, DestDirSym$, FileName$) 
  1814. '** Purpose:Calls winhelp32 to build GIDs at reinstall.
  1815. '** Author:MZ
  1816. '** Arguments:prodno%, 
  1817. '                    network$, 
  1818. '                    SectionName$, 
  1819. '                    DestDirSym$, 
  1820. '                    FileName$
  1821. '*************************************************************************
  1822. DIM ExecError%,CopyDestDir$
  1823.    IF GetListItem(SYM_INSTALLKINDS$, prodno%) = gREINSTALL$ THEN
  1824.         IF network$ = gSTANDARD$ OR network$ = gNODE$ THEN
  1825.            IF (Lot_IsTheFeatureInstalled(SectionName$) = 1) THEN
  1826.               'CopyDestDir$ = GetSymbolValue(DestDirSym$)
  1827.               CopyDestDir$ = Lot_WhereIsFeature(prodno%, SectionName$, FileName$)
  1828.          '     ExecError% = WinExec ("winhlp32 -g "+CopyDestDir$+FileName$, SW_HIDE)
  1829.               ExecError% = WinExec ("winhlp32 -g "+CopyDestDir$+FileName$, SW_SHOW)
  1830.            END IF
  1831.         END IF
  1832.    END IF
  1833. END SUB
  1834.  
  1835.  
  1836. '** UNC stuff
  1837.  
  1838.  
  1839. PUBLIC SUB Lot_SplitUNCPath (szFullPath$, szVol$, szDirPath$)
  1840. '** Purpose:Splits a string into a UNC volume and a directory path
  1841. '** Author:GJL
  1842. '** Arguments:A path string, a string for the UNC vol
  1843. '**             a string for the resulting dir path
  1844. '** Returns:If UNC vol is invalid szVol will be empty
  1845. '**     
  1846. '*************************************************************************
  1847.    DIM StrOff&, tmp&
  1848.  
  1849.    StrOff& = INSTR( szFullPath$, "\\" )
  1850.    IF StrOff = 1 THEN
  1851.       StrOff& = INSTR( MID$(szFullPath$, 3), "\" )
  1852.       IF StrOff > 0 THEN
  1853.     tmp& = StrOff + 3
  1854.     StrOff& = StrOff + 3
  1855.     StrOff& = INSTR( MID$(szFullPath$, tmp&), "\" ) - 1
  1856.     IF StrOff& > 0 THEN
  1857.        StrOff& = StrOff& + tmp&
  1858.        szVol$ = LEFT$(szFullPath$, StrOff& - 1)
  1859.        szDirPath$ = MID$(szFullPath$, StrOff)
  1860.     ELSE
  1861.        szVol$ = szFullPath$
  1862.        szDirPath = ""
  1863.     END IF
  1864.       ELSE 
  1865.     szVol$ = ""
  1866.     szDirPath = ""
  1867.       END IF
  1868.    ELSE
  1869.    szVol$ = ""
  1870.    szDirPath$ = szFullPath$       
  1871.    END IF
  1872. END SUB
  1873. '** end UNC stuff
  1874.  
  1875. PUBLIC SUB Lot_SplitAnyPath (szFullPath$, szVol$, szDirPath$)
  1876. '** Purpose:Splits a string into a volume and a directory path
  1877. '** Author:
  1878. '** Arguments:A path string, a string for the vol
  1879. '**             a string for the resulting dir path
  1880. '** Returns: Volume and directory
  1881. '**     
  1882. '*************************************************************************
  1883.  
  1884.     If Lot_IsUnvalidatedUNCPath(szFullPath$) Then
  1885.         Lot_SplitUNCPath szFullPath$, szVol$, szDirPath$
  1886.     Else
  1887.         szVol$ = LEFT$(szFullPath$, 2)
  1888.         szDirPath$ = MID$(szFullPath$,3)
  1889.     End If
  1890. END SUB
  1891.  
  1892. '***********************************************************************
  1893. PUBLIC FUNCTION Lot_GetVol (szFullPath$)
  1894. '**  Description:  
  1895. '**      Return the volume whether it is UNC or local.
  1896. '**    
  1897. '**  Explicit Parameters:
  1898. '**       szFullPath$        The path from which to extract the path.
  1899. '**
  1900. '**  Implicit Parameters:
  1901. '**  Returns:  The volume.
  1902. '***********************************************************************
  1903.  
  1904.  
  1905.     DIM szVol$, szDirPath$
  1906.  
  1907.     Lot_SplitAnyPath szFullPath$, szVol$, szDirPath$
  1908.  
  1909.     Lot_GetVol = szVol$
  1910. END FUNCTION
  1911.  
  1912. '***********************************************************************
  1913. '**
  1914. '**  Name: ShowPathError
  1915. '**  Description:  
  1916. '**      Display a path error
  1917. '**    
  1918. '**  Explicit Parameters:
  1919. '**   nmsg&          The error message number to display. Use 0 if none
  1920. '**   nDescription%  The description of the message
  1921. '**   szPath$        The path with the problem
  1922. '**
  1923. '**  Out symbols:
  1924. '**    
  1925. '**  Implicit Parameters:
  1926. '**    
  1927. '***********************************************************************
  1928.  
  1929. PUBLIC SUB ShowPathError (nmsg%, nDescription%, szPath$)
  1930.    DIM sz$
  1931.  
  1932.    sz$ = CHR$(10) + CHR$(10) + "     " + szPath$
  1933.    sz$ = NullTrim$(sz$)
  1934.    IF nDescription% <> 0 THEN
  1935.       sz$ = sz$ + CHR$(10) + CHR$(10) + LdString(nDescription%)
  1936.    END IF
  1937.    ErrorMsg nmsg%, sz$
  1938.  
  1939. END SUB
  1940.  
  1941. '***********************************************************************
  1942. '**
  1943. '**  Name: ShowPathErrorNoDlgExit
  1944. '**  Description:  
  1945. '**      Display a path error and tell the dialog not to exit
  1946. '**    
  1947. '**  Explicit Parameters:
  1948. '**   nmsg&          The error message number to display. Use 0 if none
  1949. '**   nDescription&  The description of the message
  1950. '**   szPath$        The path with the problem
  1951. '**
  1952. '**  Out symbols:
  1953. '**   __LASTSTATUS   Set to "Q" to tell script not to quit   
  1954. '**    
  1955. '**  Implicit Parameters:
  1956. '**    
  1957. '***********************************************************************
  1958.  
  1959. PUBLIC SUB ShowPathErrorNoDlgExit (nmsg%, nDescription%, szPath$)
  1960.  
  1961.    ShowPathError nmsg%, nDescription%, szPath$
  1962.    SetListItem "__LASTSTATUS", 1, "Q"
  1963.  
  1964. END SUB
  1965.  
  1966. '***********************************************************************
  1967. '**
  1968. '**  Name: IsPathWritable
  1969. '**  Description:  
  1970. '**      Determine if we can write to a path.
  1971. '**    
  1972. '**  Explicit Parameters:
  1973. '**      szPath$     Pathname with no filename.
  1974. '**
  1975. '**  Out symbols:
  1976. '**    
  1977. '**  Implicit Parameters:
  1978. '**
  1979. '**  Returns: 1 if path is writable
  1980. '**    
  1981. '***********************************************************************
  1982.  
  1983.  
  1984. PUBLIC FUNCTION IsPathWritable (szPath$) AS INTEGER
  1985.  
  1986.    DIM sz$, cb%, i%, j%
  1987.  
  1988.    '** We can't check if the path is writable if the syntax is bad
  1989.    IsPathWritable = 0
  1990.      sz$=szPath$
  1991.    IF Lot_CheckPath(szPath$) <> FALSE THEN
  1992.       '** Strip any trailing backslash
  1993.       IF cb% > 3 AND RIGHT$(sz$,1) = "\" THEN
  1994.      cb% = LEN(sz$)
  1995.      sz$ = MID$(sz$,1,(cb%-1))
  1996.       END IF
  1997.  
  1998.       '** Back through the directories until we find a directory that exists
  1999.       DO
  2000.      '** If the directory exists then return if the directory is writable
  2001.      IF LEN(sz$) <= 3 OR DoesDirExist(sz$) = 1 THEN
  2002.         IsPathWritable = IsDirWritable(sz$)
  2003.         IF IsPathWritable = FALSE THEN
  2004.               SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2005.             END IF
  2006.         EXIT DO
  2007.      END IF
  2008.  
  2009.      '** If dir does not exists then strip off the last dir and try again
  2010.      i% = INSTR(sz$,"\")
  2011.      IF i% = 0 THEN EXIT DO
  2012.      DO
  2013.         j% = INSTR((i%+1),sz$,"\")
  2014.         IF j% = 0 THEN
  2015.            IF i% = 3 THEN
  2016.           sz$ = MID$(sz$,1,3)        '** Handle root special
  2017.            ELSE
  2018.           sz$ = MID$(sz$,1,(i%-1))   '** Strip last directory
  2019.            END IF
  2020.            EXIT DO
  2021.         END IF
  2022.         i% = j%
  2023.      LOOP
  2024.       LOOP
  2025.    END IF
  2026. END FUNCTION
  2027.  
  2028. '***********************************************************************
  2029. '**
  2030. '**  Name: ValidatePath
  2031. '**  Description:  
  2032. '**      Determine if path is valid and display errors
  2033. '**
  2034. '**      THIS FUNCTION SHOULD ONLY BE USED FOR DESTINATION PATHS!!!
  2035. '**    
  2036. '**  Explicit Parameters:
  2037. '**      szPath$     Pathname with no filename
  2038. '**
  2039. '**  Out symbols:
  2040. '**    
  2041. '**  Implicit Parameters:
  2042. '**
  2043. '**  Returns: 1 if path is valid
  2044. '**    
  2045. '***********************************************************************
  2046.  
  2047. PUBLIC FUNCTION ValidatePath (szPath$) AS INTEGER
  2048.  
  2049.    DIM cch%, difflen% , notused&
  2050.    DIM volPath$, dirPath$, writable%, dirPathType$
  2051.  
  2052.    ValidatePath = FALSE
  2053.    if szPath$ = "" then 
  2054.       Exit Function
  2055.    End if
  2056.    cch% = LENBP(szPath$)
  2057.    difflen% = cch% + CINT(GetSymbolValue(SYM_DOSMAXPATHDIFF$))
  2058.    SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_ERR_DIRSYNTAXDESCRLONG)
  2059. '*** UNC stuff
  2060.    '** If it's a UNC path do some checks
  2061.  
  2062.    IF Lot_CleanPath(szPath$) = FALSE THEN
  2063.      ShowPathError SID_ERR_DIRSYNTAX,_
  2064.             CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2065.      szPath$ = NullTrim$(szPath$)
  2066.      EXIT FUNCTION
  2067.    END IF
  2068.    
  2069.    IF Lot_IsUnvalidatedUNCPath(szPath$) = TRUE THEN
  2070.  
  2071.      Lot_SplitUNCPath szPath$, volPath$, dirPath$
  2072.  
  2073.      IF Lot_IsvalidUNCPath(volPath$) = FALSE THEN
  2074.        ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, volPath$
  2075.  
  2076.      ELSEIF dirPath$ = "" OR Len(dirPath$) = 1 THEN
  2077.        ShowPathError SID_ERR_DIRSYNTAX, SID_ERR_DIRROOTDESCR, szPath$
  2078.  
  2079. '     ELSEIF Lot_CleanPath(szPath$) = FALSE THEN
  2080. '     ShowPathError SID_ERR_DIRSYNTAX,_
  2081. '            CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2082.  
  2083. '** Make sure the path is not too long
  2084.      ELSEIF difflen% > MAX_DIR_PATH THEN
  2085.     '** This is only about the path length and might need a new message
  2086.        ErrorMsg SID_ERR_PATHLEN, ""
  2087.      ELSE
  2088.        SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2089.        writable% = IsPathWritable(szPath$)
  2090.        IF writable% = FALSE THEN
  2091.      ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, szPath$
  2092.          ValidatePAth = FALSE
  2093.        ELSE
  2094.          ValidatePath = TRUE 
  2095.        END IF
  2096.      END IF
  2097. '*** end UNC stuff
  2098.    ELSE
  2099. '*** Check letter drives
  2100.       '** Make sure the drive is valid
  2101.       IF (MID$(szPath$,2,1) = ":" AND IsDriveValid(szPath$) = FALSE) THEN
  2102.     ShowPathError SID_DRV_NOTEXIST, 0, MID$(szPath$,1,2)
  2103.  
  2104.       '** Make sure the syntax of the path name is correct
  2105. '      ELSEIF Lot_CleanPath(szPath$) = FALSE THEN
  2106. '      ShowPathError SID_ERR_DIRSYNTAX,_
  2107. '             CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2108.       '** Make sure not installing to the root
  2109.       ELSEIF (LEN(szPath$) = 2) OR (LEN(szPath$) = 3 _
  2110.          AND MID$(szPath$,3,1) = "\") THEN
  2111.     ShowPathError SID_ERR_DIRSYNTAX, SID_ERR_DIRROOTDESCR, szPath$
  2112.  
  2113.      '** Make sure the path is not too long
  2114.       ELSEIF difflen% > MAX_DIR_PATH THEN
  2115.     '** This is only about the path length and might need a new message
  2116.     ErrorMsg SID_ERR_PATHLEN, ""
  2117.       ELSE
  2118.     '** Make sure the path is writable
  2119.  
  2120.     writable% = IsPathWritable(szPath$)
  2121.     IF writable% = FALSE THEN
  2122.           SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2123.       ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, szPath$
  2124.       ValidatePAth = FALSE
  2125.     ELSE
  2126.       ValidatePath = TRUE
  2127.     END IF
  2128.        END IF
  2129.    END IF
  2130.    szPath$ = NullTrim$(szPath$)
  2131. END FUNCTION
  2132.  
  2133. 'PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  2134. '** Purpose:check editbox text for valid volumes 
  2135. '** Author:
  2136. '** Arguments:
  2137. '** Returns:
  2138. '**     
  2139. '*************************************************************************
  2140. PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  2141.    DIM  eb$, vol$, path$, editbox$, combobox$, comboId%
  2142.  
  2143.    comboBox = "IDC_COMBO"+Right$(Str$(Ctrl%),1)
  2144.    editBox = "IDC_EDIT"+Right$(Str$(Ctrl%),1)
  2145.    comboId% = Ctrl% + 400
  2146. '**CB_GETCURSEL = 0x147 = 327
  2147.    ValidateEditBox = 1 + SendMessage(GetDlgItem(hDlg&,comboId%), 327, 0, 0)
  2148.    eb$=GetListItem("IDC_EDIT",Ctrl%)
  2149.    Lot_SplitUNCPath eb$, vol$, path$
  2150.    IF NOT vol$ = "" THEN
  2151. '** There is a UNC path in the edit box
  2152.       ValidateEditBox = SelectDriveCombo(combobox, vol$)
  2153.       IF ValidateEditBox = 0 THEN
  2154.         ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, vol$
  2155.                 EXIT FUNCTION
  2156.       END IF
  2157.       IF ValidatePath(eb$) = FALSE THEN
  2158.         ValidateEditBox = 0
  2159.         EXIT FUNCTION
  2160.       END IF
  2161.    ELSE
  2162.       IF MID$(eb$,2,1) = ":" THEN
  2163. '** There is a drive letter in the edit box
  2164.      ValidateEditBox = SelectDriveCombo (comboBox, eb$)
  2165.      IF ValidateEditBox = 0 THEN
  2166.         ShowPathError SID_DRV_NOTEXIST, 0, Left$(eb$,2)
  2167.      ELSE
  2168.         SetListItem "IDC_EDIT", Ctrl%, Lot_ExtractDirectory(eb$)
  2169.         AddListItem SYM_UPDATELIST$, editBox
  2170.      END IF
  2171.       ELSE 
  2172.      IF MID$(eb$,1,1) <> "\" THEN
  2173.         SetListItem "IDC_EDIT", Ctrl%, "\"+eb$
  2174.         AddListItem SYM_UPDATELIST$, editBox
  2175.       
  2176.      END IF
  2177.       END IF
  2178.    END IF
  2179. END FUNCTION
  2180.  
  2181. 'PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  2182. '** Purpose:check browse results text for valid volumes 
  2183. '** Author:
  2184. '** Arguments:
  2185. '** Returns:
  2186. '**     
  2187. '*************************************************************************
  2188. PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  2189.    DIM  eb$, vol$, path$, editbox$, combobox$, comboId%
  2190.  
  2191.    comboBox = "IDC_COMBO"+Right$(Str$(Ctrl%),1)
  2192.    editBox = "IDC_EDIT"+Right$(Str$(Ctrl%),1)
  2193.    comboId% = Ctrl% + 400
  2194. '**CB_GETCURSEL = 0x147 = 327
  2195.    ValidateBrowse = 1 + SendMessage(GetDlgItem(hDlg&,comboId%), 327, 0, 0)
  2196.    eb$=GetSymbolValue("SYM_BROWSE_RESULT")
  2197.    Lot_SplitUNCPath eb$, vol$, path$
  2198.    IF NOT vol$ = "" THEN
  2199.       IF ValidatePath(eb$) = FALSE THEN
  2200.         ValidateBrowse = FALSE
  2201.         EXIT FUNCTION
  2202.       END IF
  2203.       ValidateBrowse = SelectDriveCombo(combobox, vol$)
  2204.       IF ValidateBrowse = 0 THEN
  2205.         ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, vol$
  2206.       ELSE
  2207.     SetListItem "IDC_EDIT", Ctrl%, eb$
  2208.     AddListItem SYM_UPDATELIST$, editBox
  2209.       END IF
  2210.       EXIT FUNCTION
  2211.    ELSE
  2212.       IF MID$(eb$,2,1) = ":" THEN
  2213.      ValidateBrowse = SelectDriveCombo (comboBox, eb$)
  2214.      IF ValidateBrowse = 0 THEN
  2215.         ShowPathError SID_DRV_NOTEXIST, 0, Left$(eb$,2)
  2216.      ELSE
  2217.         SetListItem "IDC_EDIT", Ctrl%, Lot_ExtractDirectory(eb$)
  2218.         AddListItem SYM_UPDATELIST$, editBox
  2219.      END IF
  2220.       ELSE 
  2221.      IF MID$(eb$,1,1) <> "\" THEN
  2222.         SetListItem "IDC_EDIT", Ctrl%, "\"+eb$
  2223.         AddListItem SYM_UPDATELIST$, editBox
  2224.       
  2225.      END IF
  2226.       END IF
  2227.    END IF
  2228. END FUNCTION
  2229.  
  2230.  
  2231.  
  2232.  
  2233. PUBLIC FUNCTION Lot_Dir  (szDir$) AS STRING
  2234. '** Purpose:
  2235. '** Author:
  2236. '** Arguments:
  2237. '** Returns:
  2238. '**     
  2239. '*************************************************************************
  2240.     DIM DirRet$
  2241.  
  2242.     DirRet$ = Dir$(szDir$)
  2243.     Lot_Dir = DirRet$
  2244. END FUNCTION
  2245.  
  2246. PUBLIC FUNCTION Lot_GetLocalHardDrive(ProdSize&,DefaultDir$) AS STRING
  2247. '** Purpose:
  2248. '**     Gets the first writable local hard disk with enough space e.g. D:
  2249. '** Arguments:
  2250. '**     ProdSize& the minimum size requirements for installing a product
  2251. '**     DefaultDir$  the default directory to install to
  2252. '** Returns:
  2253. '**     D:\ + DefaultDir$ or an empty string
  2254. '*************************************************************************
  2255.    DIM Length%, count%, lDrive$, SpaceAvail&
  2256.  
  2257.    Lot_GetLocalHardDrive = ""
  2258.    Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  2259.     IF Length% = 0 THEN
  2260.        GetLocalHardDrivesList SYM_LOCALHARDDRIVES$
  2261.        Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  2262.     END IF
  2263.    FOR count% = 1 TO Length%
  2264.       lDrive$     = GetListItem(SYM_LOCALHARDDRIVES$, count%)
  2265.       SpaceAvail& = GetFreeSpaceForDrive(lDrive$)
  2266.       lDrive$     = lDrive$ + ":\" + DefaultDir$
  2267.       IF SpaceAvail& > (ProdSize& \ 1024) AND IsPathWritable(lDrive$) THEN
  2268.      Lot_GetLocalHardDrive = LCASE$(lDrive$)
  2269.      EXIT FUNCTION
  2270.       END IF
  2271.    NEXT
  2272.  
  2273. END FUNCTION
  2274.  
  2275. PUBLIC FUNCTION Lot_GetNetHardDrive(ProdSize&,DefaultDir$) AS STRING
  2276. '** Purpose:
  2277. '**     Gets the first writable network hard disk with enough space e.g. D:
  2278. '** Arguments:
  2279. '**     ProdSize& the minimum size requirements for installing a product
  2280. '**     DefaultDir$  the default directory to install to
  2281. '** Returns:
  2282. '**     D:\ + DefaultDir$ or an empty string
  2283. '*************************************************************************
  2284.    DIM Length%, count%, lDrive$, SpaceAvail&
  2285.  
  2286.    Lot_GetNetHardDrive = ""
  2287.    GetNetworkDrivesList SYM_NETHARDDRIVES$
  2288.    Length% = GetListLength(SYM_NETHARDDRIVES$)
  2289.    FOR count% = 1 TO Length%
  2290.       lDrive$     = GetListItem(SYM_NETHARDDRIVES$, count%)
  2291.       SpaceAvail& = GetFreeSpaceForDrive(lDrive$)
  2292.       lDrive$     = lDrive$ + ":\" + DefaultDir$
  2293.       IF SpaceAvail& > (ProdSize& \ 1024) AND IsPathWritable(lDrive$) THEN
  2294.      Lot_GetNetHardDrive = LCASE$(lDrive$)
  2295.      EXIT FUNCTION
  2296.       END IF
  2297.    NEXT
  2298.  
  2299. END FUNCTION
  2300.  
  2301. PUBLIC FUNCTION Lot_GetAllHardDrive(ProdSize&,DefaultDir$) AS STRING
  2302. '** Purpose:
  2303. '**     Gets the first writable local or network hard disk with enough 
  2304. '**     space e.g. D:
  2305. '** Arguments:
  2306. '**     ProdSize& the minimum size requirements for installing a product
  2307. '**     DefaultDir$  the default directory to install to
  2308. '** Returns:
  2309. '**     D:\ + DefaultDir$ or an empty string
  2310. '*************************************************************************
  2311.  
  2312.    DIM   drv$
  2313.  
  2314.    drv$ = Lot_GetLocalHardDrive(ProdSize&, DefaultDir$)
  2315.    IF drv$ <> "" THEN
  2316.       Lot_GetAllHardDrive = drv$
  2317.    ELSE
  2318.       Lot_GetAllHardDrive = Lot_GetNetHardDrive(ProdSize&, DefaultDir$)
  2319.    END IF
  2320.  
  2321. END FUNCTION
  2322.  
  2323. PUBLIC FUNCTION Lot_GetChapterFromKeyword (szKeyword$) AS STRING
  2324. '** Purpose: Get the chapter # given the Chapter name
  2325. '** Author:
  2326. '** Arguments:
  2327. '** Returns:
  2328. '**     
  2329. '*************************************************************************
  2330.     DIM g_strbuf$
  2331.  
  2332.     g_strbuf$ = CreateBuffer(256)
  2333.     If FGetChapterFromKeyword(szKeyword$, g_strbuf$, 256) = 0 Then
  2334.        Lot_GetChapterFromKeyword = ""
  2335.     Else
  2336.        Lot_GetChapterFromKeyword = NullTrim(g_strbuf$)
  2337.     End If
  2338. END FUNCTION
  2339.  
  2340. PUBLIC Lot_CallExec_RC$ 
  2341.  
  2342. PUBLIC FUNCTION Lot_CallProductFunctions (func_name$, BYVAL direction$, always%, back$, parms$) AS STRING
  2343. '** Purpose:
  2344. '** Author:
  2345. '** Arguments:
  2346. '**     func_name$: Name of function + prod Acronym will be called.
  2347. '**     always%: IF TRUE then alwasy calls function, otherwise only if product is turned on.
  2348. '**     direction$: determines the direction: gBACK means start at the last callback.
  2349. '** Returns:
  2350. '**     
  2351. '*************************************************************************
  2352.   DIM n%, i%, lname$, prodcall$, notused%, incr%
  2353.  
  2354.   Lot_CallProductFunctions = ""
  2355.   n% = Reg_GetNumberOfProducts()
  2356.   If direction$ = gBACK Then
  2357.     i% = n%
  2358.     incr% = 1
  2359.   Else
  2360.     i% = 1
  2361.     incr% = -1
  2362.   End If
  2363.   WHILE (i%  >= 1 AND i% <= n%)
  2364.  
  2365.      lname$ = Reg_GetProductAcronym(i%)
  2366.      If lname$ <> "" AND (always% <> FALSE OR Prods(i%).UIInOrOut <> FALSE) Then
  2367.             '
  2368.             ' construct a lotus script statement for EXECUTE. It will look
  2369.             ' something like this:
  2370.             '     INIT123(i%, "server$", parms$)
  2371.             '
  2372.     If parms$ <> "" Then
  2373.        prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & i% & "," & |"| & GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| &  "," & parms$ & ")"
  2374.     Else
  2375.        prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & i% & "," & |"| &  GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & ")"
  2376.     End If
  2377.      ' DOEXEC removed and replaced by EXECUTE!
  2378.             ' call DOEXEC, which acts like the script EXECUTE statement.
  2379.             ' The difference is that DOEXEC operates in the default module,
  2380.             ' while  EXECUTE creates a temporary module that disappears once the
  2381.             ' call is made.  The first parameter to DOEXEC is a module name,
  2382.             ' which is made into a "USE modname" statement, if that module 
  2383.             ' name has not yet been USE'd via DOEXEC. The second arg is the
  2384.             ' statement to be run. Note - the args must be call by value,
  2385.             ' not reference (can be done by enclosing args in parens)       
  2386.  
  2387.           gEndStatementEncountered% = FALSE
  2388.     '** TV : old execute : on error doesn't work
  2389.     'EXECUTE(|USE "| & lname$ & |" : | & prodcall$)
  2390.     '** TV : new 
  2391.     EXECUTE(|USE "| & lname$ & |" : SUB INITIALIZE : | & prodcall$ & |:END SUB|)
  2392.  
  2393.           '  this gEndStatementEncountered flag is necessary because the Lotus
  2394.           '  END statement, which normally exists the entire program, only
  2395.     '  exits the top-level routine running in DOEXEC.  So,
  2396.           '  check this flag here, to see if we hit an END during DOEXEC.
  2397.  
  2398.           IF gEndStatementEncountered% = TRUE THEN
  2399.             END                                            ' exit the program
  2400.           END IF
  2401.  
  2402.     direction$ = Lot_CallExec_RC$
  2403.     If direction$ = gBACK Then
  2404.        incr% = -1
  2405.     Else
  2406.        incr% = 1
  2407.     End If
  2408.      End If
  2409.  
  2410.      If direction$ = gBACK AND back$ = gALLPRODUCTS then
  2411.        Lot_CallProductFunctions = direction$
  2412.        Exit Function
  2413.      End If
  2414.  
  2415.      i% = i% + incr%
  2416.   WEND
  2417.  
  2418.   Lot_CallProductFunctions = direction$
  2419.  
  2420. END FUNCTION
  2421.  
  2422. PUBLIC FUNCTION Lot_CallOneProductFunction (prodno%, func_name$, BYVAL direction$, always%, parms$) AS STRING
  2423. '** Purpose:
  2424. '** Author:
  2425. '** Arguments:
  2426. '** Returns:
  2427. '**     
  2428. '*************************************************************************
  2429.   DIM lname$, prodcall$, notused%
  2430.  
  2431.   Lot_CallOneProductFunction = ""
  2432.   lname$ = Reg_GetProductAcronym(prodno%)
  2433.   If lname$ <> "" Then
  2434.      '
  2435.      ' construct a lotus script statement for EXECUTE. It will look
  2436.      ' something like this:
  2437.      '     USE "123":INIT123(prodno%, "server$", parms$)
  2438.      '
  2439.      If parms$ <> "" Then
  2440.     prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & prodno% & "," & |"| & GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & "," & parms$ & ")"
  2441.      Else
  2442.     prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & prodno% & "," & |"| &  GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & ")"
  2443.      End If
  2444.  
  2445.      ' DOEXEC removed and replaced by EXECUTE!
  2446.             ' call DOEXEC, which acts like the script EXECUTE statement.
  2447.             ' The difference is that DOEXEC operates in the default module,
  2448.             ' while  EXECUTE creates a temporary module that disappears once the
  2449.             ' call is made.  The first parameter to DOEXEC is a module name,
  2450.             ' which is made into a "USE modname" statement, if that module 
  2451.             ' name has not yet been USE'd via DOEXEC. The second arg is the
  2452.             ' statement to be run. Note - the args must be call by value,
  2453.             ' not reference (can be done by enclosing args in parens)       
  2454.             
  2455.        gEndStatementEncountered% = FALSE            ' see Lot_CallProductFunctions
  2456.  
  2457.       '** TV : old execute : on error doesn't work
  2458.       'EXECUTE(|USE "| & lname$ & |" : | & prodcall$)
  2459.       '** TV : new 
  2460.       EXECUTE(|USE "| & lname$ & |" : SUB INITIALIZE : | & prodcall$ & |:END SUB|)
  2461.     
  2462.  
  2463.        IF gEndStatementEncountered% = TRUE THEN
  2464.             END                                            ' exit the program
  2465.        END IF
  2466.  
  2467.      Lot_CallOneProductFunction = Lot_CallExec_RC$
  2468.  
  2469.  
  2470.   End If
  2471.  
  2472.  
  2473. END FUNCTION
  2474.  
  2475. '*************************************************************************
  2476. PUBLIC FUNCTION Lot_CheckPath (path$) AS INTEGER
  2477. '** Purpose:
  2478. '** Author:
  2479. '** Arguments:
  2480. '** Returns:
  2481. '**     
  2482. '*************************************************************************
  2483.    DIM ldrive$, vol$, unused$
  2484.  
  2485.    Lot_CheckPath = FALSE
  2486.    path$ = NullTrim( path$ )
  2487.    IF path$ <> "" THEN
  2488.       Lot_SplitUNCPath path$, vol$, unused$
  2489.       IF vol$ = "" THEN
  2490.        ldrive$ = Lot_ExtractDriveLetter(path$)
  2491.  
  2492.        IF IsDriveValid(ldrive$) <> FALSE AND Lot_CleanPath(path$) <> FALSE THEN 
  2493.            Lot_CheckPath = TRUE
  2494.        END IF
  2495.       ELSE
  2496.        IF Lot_CleanPath(path$) <> FALSE THEN 
  2497.         Lot_CheckPath = TRUE
  2498.        END IF
  2499.       END IF
  2500.    END IF
  2501.  
  2502. END FUNCTION
  2503.  
  2504. PUBLIC FUNCTION Lot_GetFirst (szChapt$, nFlag%) AS STRING
  2505. '** Purpose:
  2506. '** Author:
  2507. '** Arguments:
  2508. '** Returns:
  2509. '**     
  2510. '*************************************************************************
  2511.   DIM g_strbuf$, Length%
  2512.  
  2513.   g_strbuf$ = CreateBuffer(256)
  2514.   if FGetFirst(szChapt$,g_strbuf$,CLng(nFlag%)) = 0 then
  2515.       Lot_GetFirst = ""     
  2516.   else
  2517.      Lot_GetFirst = NullTrim(g_strbuf)
  2518.  end if
  2519.  
  2520.  
  2521. END FUNCTION
  2522. '*************************************************************
  2523.  
  2524. PUBLIC FUNCTION Lot_GetNext () AS STRING
  2525. '** Purpose:
  2526. '** Author:
  2527. '** Arguments:
  2528. '** Returns:
  2529. '**     
  2530. '*************************************************************************
  2531.       DIM g_strbuf$
  2532.   
  2533.     g_strbuf$ = CreateBuffer(256)
  2534.     if FGetNext(g_strbuf$) = 0 then
  2535.        Lot_GetNext = ""         
  2536.     else
  2537.        Lot_GetNext = NullTrim(g_strbuf$)
  2538.      end if
  2539.  
  2540. END FUNCTION
  2541. '*************************************************************************
  2542.  
  2543. PUBLIC FUNCTION Lot_SetDateOfFile (szFile$, szDate$) AS INTEGER
  2544. '** Purpose:
  2545. '** Author:
  2546. '** Arguments:
  2547. '** Returns:
  2548. '**     
  2549. '*************************************************************************
  2550.   if FSetDateOfFile(szFile$,szDate$) = 0 then
  2551.     Lot_SetDateOfFile = 0   
  2552.   else
  2553.      Lot_SetDateOfFile = 1
  2554.   end if
  2555.  
  2556.  
  2557. END FUNCTION
  2558. '*************************************************************
  2559.  
  2560. PUBLIC SUB Lot_RemoveSectionFilesFromCopyList (szSect$) 
  2561. '** Purpose:
  2562. '** Author:
  2563. '** Arguments:
  2564. '** Returns:
  2565. '**     
  2566. '*************************************************************************
  2567. %rem
  2568.     if FValidInfSect(szSect$) = 0 then
  2569.     n% = 1
  2570.     else
  2571.     n% = 0
  2572.     end if
  2573.     if n% > 0 then
  2574.     BadArgErr n%, "Lot_RemoveSectionFilesFromCopyList", szSect$
  2575.     end if
  2576. %endrem ''DEBUG
  2577.  
  2578.     IF FRemoveSectionFilesFromCopyList (szSect$) = 0 THEN
  2579.     ErrorMsg SID_ERR_LOT_RSFFCL, ""
  2580.     ERROR STFQUIT
  2581.     END IF
  2582. END SUB
  2583. '*************************************************************************
  2584.  
  2585. PUBLIC SUB Lot_RemoveSectionKeyFileFromCopyList (szSect$, szKey$) 
  2586. '** Purpose:
  2587. '** Author:
  2588. '** Arguments:
  2589. '** Returns:
  2590. '**     
  2591. '*************************************************************************
  2592. %rem
  2593.     if FValidInfSect(szSect$) = 0 then
  2594.     n% = 1
  2595.     elseif szKey$ = "" then
  2596.     n% = 2
  2597.     else
  2598.     n% = 0
  2599.     end if
  2600.     if n% > 0 then
  2601.     BadArgErr n%, "Lot_RemoveSectionKeyFileFromCopyList", szSect$+", "+szKey$
  2602.     end if
  2603. %endrem ''DEBUG
  2604.  
  2605.     IF FRemoveSectionKeyFileFromCopyList (szSect$, szKey$) = 0 THEN
  2606.     ErrorMsg SID_ERR_LOT_RSKFFCL, ""
  2607.     ERROR STFQUIT
  2608.     END IF
  2609. END SUB
  2610. '*************************************************************************
  2611.  
  2612. PUBLIC FUNCTION Lot_GetInfSectionSize (szSect$)  AS LONG
  2613. '** Purpose:
  2614. '** Author:
  2615. '** Arguments:
  2616. '** Returns:
  2617. '**     
  2618. '*************************************************************************
  2619. %rem
  2620.     if FValidInfSect(szSect$) = 0 then
  2621.     n% = 1
  2622.     else
  2623.     n% = 0
  2624.     end if
  2625.     if n% > 0 then
  2626.     ERROR STFQUIT
  2627.     end if
  2628. %endrem
  2629.     Lot_GetInfSectionSize = LcbGetInfSectionSize(szSect$)
  2630. END FUNCTION
  2631.  
  2632. '** DND: These functions need an ASSERT!!!!!!!
  2633.  
  2634. PUBLIC FUNCTION Lot_AddPagetoNotebook (hDlg&,  Notebookid&,DlgId%, Tabstring$)   AS INTEGER
  2635. '** Purpose:
  2636. '** Author:
  2637. '** Arguments:
  2638. '** Returns:
  2639. '**     
  2640. '*************************************************************************
  2641.     DIM Dll$
  2642.     Dll$ = FindResourceinDLL (CLng(DlgId%), RT_DIALOG)
  2643.     If Dll$ = "" then
  2644.         Dll$ = "mscuistf.dll"
  2645.     End if
  2646.     Lot_AddPagetoNotebook = NotebookAddDlgPage(hDlg&,  Notebookid&,CLng(DlgId%), Dll$,FNAMEORGDLGPROC$,Tabstring$) 
  2647.     IF Lot_AddPagetoNotebook = 0 THEN
  2648.        ErrorMsg 0, "Error creating notebook page"
  2649.       ERROR STFQUIT
  2650.     END IF
  2651. END FUNCTION
  2652. '*************************************************************************
  2653.  
  2654. PUBLIC FUNCTION Lot_NotebookPageView (hDlg&,  Notebookid&, DlgId%, fShowPage%) AS INTEGER
  2655. '** Purpose:
  2656. '** Author:
  2657. '** Arguments:
  2658. '** Returns:
  2659. '**     
  2660. '*************************************************************************
  2661.    Lot_NotebookPageView = FNotebookPageView (hDlg&,  Notebookid&, CLng(DlgId%), CLng(fShowPage%))
  2662.    IF Lot_NotebookPageView = 0 THEN
  2663.       ErrorMsg 0, "Error viewing notebook page"
  2664.       ERROR STFQUIT
  2665.    END IF
  2666. END FUNCTION
  2667. '*************************************************************************
  2668.  
  2669. PUBLIC SUB Lot_TurnToPage (hDlg&,Notebookid&, pageid%) 
  2670. '** Purpose:
  2671. '** Author:
  2672. '** Arguments:
  2673. '** Returns:
  2674. '**     
  2675. '*************************************************************************
  2676.     IF  FNotebookTurnToPage(hDlg&,Notebookid&, CLng(pageid%)) <> 1 THEN
  2677.        ErrorMsg 0, "Error turning notebook page"
  2678.       ERROR STFQUIT
  2679.     END IF
  2680. END SUB
  2681. '*************************************************************************
  2682.  
  2683. PUBLIC FUNCTION Lot_GetPagehandle  (hDlg&,Notebookid&,Pageid%) AS LONG
  2684. '** Purpose:
  2685. '** Author:
  2686. '** Arguments:
  2687. '** Returns:
  2688. '**     
  2689. '*************************************************************************
  2690.     Lot_GetPagehandle = NotebookGetPageHwnd(hDlg&,Notebookid&,CLng(Pageid%)) 
  2691.     IF Lot_GetPagehandle = 0 THEN
  2692.        ErrorMsg 0, "Error getting the notebook page handle"
  2693.        ERROR STFQUIT
  2694.     END IF
  2695. END FUNCTION
  2696. '*************************************************************************
  2697.  
  2698. PUBLIC SUB Lot_LCBResetContent(hDlg&)
  2699. '** Purpose:
  2700. '** Author:
  2701. '** Arguments:
  2702. '** Returns:
  2703. '**     
  2704. '*************************************************************************
  2705.   LCBResetContent hDlg&
  2706. END SUB
  2707. '*************************************************************************
  2708.  
  2709. PUBLIC SUB Lot_LCBSetRedraw (hDlg&, fRedraw%)
  2710. '** Purpose:
  2711. '** Author:
  2712. '** Arguments:
  2713. '** Returns:
  2714. '**     
  2715. '*************************************************************************
  2716.   LCBSetRedraw hDlg&, CLng(fRedraw%)
  2717. END SUB
  2718. '*************************************************************************
  2719.  
  2720. PUBLIC FUNCTION Lot_LCBGetCount (hDlg&) AS INTEGER
  2721.  
  2722. '** Purpose:
  2723. '** Author:
  2724. '** Arguments:
  2725. '** Returns:
  2726. '**     
  2727. '*************************************************************************
  2728.  
  2729.    Lot_LCBGetCount = LCBGetCount(hDlg&)
  2730.  
  2731. END FUNCTION
  2732. '*************************************************************************
  2733.  
  2734. PUBLIC FUNCTION Lot_LCBAddItem (hDlg&, item$) AS INTEGER
  2735. '** Purpose:
  2736. '** Author:
  2737. '** Arguments:
  2738. '** Returns:
  2739. '**     
  2740. '*************************************************************************
  2741.      DIM rc%
  2742.  
  2743.    rc% = LCBAddItem (hDlg&, item$)
  2744.    If (rc% = 0) Then
  2745.       ErrorMsg 0, "Could not Add Item: "+item$+" to LCB on DLG: "+STR$(hDlg&)
  2746.       ERROR STFQUIT
  2747.    End If
  2748.    Lot_LCBAddItem= rc%
  2749.  
  2750. END FUNCTION
  2751. '*************************************************************************
  2752.  
  2753. PUBLIC FUNCTION Lot_LCBReplaceItem (hDlg&, index%, itemnum%, item$) AS INTEGER
  2754. '** Purpose:
  2755. '** Author:
  2756. '** Arguments:
  2757. '** Returns:
  2758. '**     
  2759. '*************************************************************************
  2760.    DIM rc%
  2761.  
  2762.    rc% = LCBReplaceItem (hDlg&, CLng(index%), CLng(itemnum%), item$)
  2763.    Lot_LCBReplaceItem = rc%
  2764.  
  2765. END FUNCTION
  2766. '*************************************************************************
  2767.  
  2768. PUBLIC FUNCTION Lot_LCBGetItem (hDlg&, index%, itemnum%) AS STRING
  2769. '** Purpose:
  2770. '** Author:
  2771. '** Arguments:
  2772. '** Returns:
  2773. '**???     
  2774. '*************************************************************************
  2775. DIM rc%
  2776. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2777.  
  2778.      rc% = LCBGetItem (hDlg&, CLng(index%), CLng(itemnum%), szValue$, cbSymValMax)
  2779.      Lot_LCBGetItem = NullTrim(szValue$)
  2780.  
  2781. END FUNCTION
  2782. '*************************************************************************
  2783.  
  2784. PUBLIC FUNCTION Lot_LCBToggleItem  (hDlg&, index%) AS INTEGER
  2785. '** Purpose:
  2786. '** Author:
  2787. '** Arguments:
  2788. '** Returns:
  2789. '**     
  2790. '*************************************************************************
  2791.    DIM rc%
  2792.  
  2793.    rc% = LCBToggleItem (hDlg&, CLng(index%))
  2794.    Lot_LCBToggleItem = rc%
  2795.  
  2796. END FUNCTION
  2797.  
  2798. '*************************************************************************
  2799.  
  2800. PUBLIC SUB Lot_LCBSetSel (hDlg&, index%)
  2801. ' wrapper 
  2802. '*************************************************************************
  2803.   LCBSetSel hDlg&, CLng(index%)
  2804. END SUB
  2805.  
  2806. '*************************************************************************
  2807.  
  2808. PUBLIC SUB Lot_LCBSetTabs (hDlg&, t1%, t2%, t3%, t4%)
  2809. ' wrapper 
  2810. '*************************************************************************
  2811.   LCBSetTabs hDlg&, CLng(t1%), CLng(t2%), CLng(t3%), CLng(t4%)
  2812. END SUB
  2813.  
  2814. '*************************************************************************
  2815.  
  2816. PUBLIC FUNCTION Lot_GetFirstChild (szChapt$, nFlag%) AS STRING
  2817. '** Purpose:
  2818. '** Author:
  2819. '** Arguments:
  2820. '** Returns:
  2821. '**     
  2822. '*************************************************************************
  2823. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2824.  
  2825.     if FGetFirstChild(szChapt$, szValue$, CLng(nFlag%)) = 0 then
  2826.      Lot_GetFirstChild = ""         
  2827.     else
  2828.      Lot_GetFirstChild = NullTrim(szValue$ )
  2829.     end if
  2830.  
  2831. END FUNCTION
  2832. '*************************************************************************
  2833.  
  2834. PUBLIC FUNCTION Lot_GetGroupName ( szGroupFileName$) AS STRING  
  2835. '** Purpose:
  2836. '** Author:
  2837. '** Arguments:
  2838. '** Returns:
  2839. '**     
  2840. '*************************************************************************
  2841.    DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2842.  
  2843.    IF FGetGroupName(szGroupFileName$, szValue$, cbSymValMax) = 0 THEN
  2844.       Lot_GetGroupName = ""
  2845.    ELSE
  2846.       Lot_GetGroupName = NullTrim(szValue$)
  2847.    END IF
  2848.  
  2849. END FUNCTION
  2850. '*************************************************************************
  2851.  
  2852. PUBLIC FUNCTION Lot_GetChapterValStr (szChapter$, nField%)  AS STRING 
  2853. '** Purpose:
  2854. '** Author:
  2855. '** Arguments:
  2856. '** Returns:
  2857. '**     
  2858. '*************************************************************************
  2859.    DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2860.  
  2861.    IF FGetChapterValStr(szChapter$, CLng(nField%), szValue$, cbSymValMax) = 0 THEN
  2862.       Lot_GetChapterValStr = ""
  2863.    ELSE
  2864.       Lot_GetChapterValStr = NullTrim(szValue$)
  2865.    END IF
  2866.  
  2867. END FUNCTION
  2868. '*************************************************************************
  2869.  
  2870. PUBLIC FUNCTION Lot_GetChapterValInt (szChapter$,nField%) AS INTEGER  
  2871. '** Purpose:
  2872. '** Author:
  2873. '** Arguments:
  2874. '** Returns:
  2875. '**     
  2876. '*************************************************************************
  2877.    DIM lpVal&
  2878.    
  2879.    if FGetChapterValInt(szChapter$, CLng(nField%),lpVal&) = 0 then
  2880.        Lot_GetChapterValInt = -1    
  2881.    else
  2882.       Lot_GetChapterValInt = CInt(lpVal&)
  2883.    end if
  2884.  
  2885. END FUNCTION
  2886. '*************************************************************************
  2887.  
  2888. PUBLIC FUNCTION Lot_GetNextSibling (szChapter$,nField%) AS STRING
  2889. '** Purpose:
  2890. '** Author:
  2891. '** Arguments:
  2892. '** Returns:
  2893. '**     
  2894. '*************************************************************************
  2895. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2896.  
  2897.     if FGetNextSibling(szChapter$, szValue$,CLng(nField%)) = 0 then
  2898.        Lot_GetNextSibling = ""  
  2899.     else
  2900.        Lot_GetNextSibling = NullTrim(szValue$)
  2901.     end if
  2902.  
  2903. END FUNCTION
  2904. '*************************************************************************
  2905.  
  2906. PUBLIC FUNCTION Lot_GetNextChild () AS STRING
  2907. '** Purpose:
  2908. '** Author:
  2909. '** Arguments:
  2910. '** Returns:
  2911. '**     
  2912. '*************************************************************************
  2913.    DIM g_strbuf$, Length%
  2914.  
  2915.    g_strbuf$ = CreateBuffer(256)
  2916.    if FGetNextChild(g_strbuf$) = 0 then
  2917.       Lot_GetNextChild = ""     
  2918.    else
  2919.       Lot_GetNextChild = NullTrim(g_strbuf$)
  2920.     end if
  2921.  
  2922. END FUNCTION
  2923. '*************************************************************************
  2924.  
  2925. PUBLIC FUNCTION Lot_GetInfChapterSize (szChapter$)  AS LONG
  2926. '** Purpose:
  2927. '** Author:
  2928. '** Arguments:
  2929. '** Returns:
  2930. '**     
  2931. '*************************************************************************
  2932.    DIM size&
  2933.  
  2934.    size&= LcbGetInfChapterSize(szChapter$)
  2935.    if size& = -1 then
  2936.      Lot_GetInfChapterSize = -1         
  2937.    else
  2938.      Lot_GetInfChapterSize = size&
  2939.    end if
  2940.  
  2941. END FUNCTION
  2942. '*************************************************************************
  2943.  
  2944. PUBLIC SUB Lot_ToggleChapterFilesInCopyList (szChapter$)  
  2945. '** Purpose:
  2946. '** Author:
  2947. '** Arguments:
  2948. '** Returns:
  2949. '**     
  2950. '*************************************************************************
  2951.  
  2952.    If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  2953.       ERROR STFTOGGLE
  2954.    End If
  2955.  
  2956. END SUB
  2957.  
  2958.  
  2959. '*************************************************************************
  2960.  
  2961. PUBLIC FUNCTION Lot_SetChapterFilesInCopyListInOrOut (szChapter$, InOrOut%) AS INTEGER
  2962. '** Purpose: Given a chapter, This function turns the feature on or off.
  2963. '**          It is written to be especially careful that features are not
  2964. '**          turned on if they are not allowed to be. Examples are:
  2965. '**          NODE: If the feaure doesn't exist on the Server
  2966. '**          ANY TYPE: If the feature is not in the INF file
  2967. '** Author: Marcel Meth
  2968. '** Arguments: szChapter$: The chapter number, e.g. "1.2.1"
  2969. '**               InOrOut: 1 for in, 0 for Out
  2970. '** Returns: Wheter the feature is actually In (1) or Out (0)
  2971. '**          regardless of what the request was.
  2972. '**     
  2973. '*************************************************************************
  2974. DIM curinorout%, FeatureToFind$
  2975.  
  2976.    If szChapter$ = "" Then
  2977.       Lot_SetChapterFilesInCopyListInOrOut  = 0
  2978.       Exit FUNCTION
  2979.    End If
  2980.  
  2981.    curinorout% = Lot_GetChapterValInt(szChapter$, F_INOROUT)
  2982.    '** If the current setting already equals the requested setting
  2983.    If InOrOut% = curinorout% Then
  2984.       Lot_SetChapterFilesInCopyListInOrOut  = InOrOut%
  2985.       Exit FUNCTION
  2986.    End If
  2987.  
  2988.    '** If the requested setting is IN
  2989.    If  InOrOut% = 1 THEN
  2990.       Lot_SetChapterFilesInCopyListInOrOut = 1
  2991.  
  2992.       '** For a node install, make sure the server has the feature
  2993.       If GetSymbolValue("NETWORK") = gNODE Then
  2994.      FeatureToFind$ = Lot_GetChapterValStr(szChapter$, F_KEYWORD)
  2995.      If Lot_IsTheFeatureInstalled(FeatureToFind$) = FALSE Then
  2996.         Lot_SetChapterFilesInCopyListInOrOut = 0
  2997.         Exit Function
  2998.      End If
  2999.       End If
  3000.  
  3001.       If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  3002.      Lot_SetChapterFilesInCopyListInOrOut = 0
  3003.       End If
  3004.  
  3005.    '** If the requested setting is OUT
  3006.    Else
  3007.       Lot_SetChapterFilesInCopyListInOrOut = 0
  3008.       If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  3009.      Lot_SetChapterFilesInCopyListInOrOut = 1
  3010.       End If
  3011.    End If
  3012.  
  3013. END FUNCTION
  3014.  
  3015.  
  3016. '*************************************************************************
  3017.  
  3018. PUBLIC SUB Lot_InitializeCopyList (szChpt$, nField%) 
  3019. '** Purpose:
  3020. '** Author:
  3021. '** Arguments:
  3022. '** Returns:
  3023. '**     
  3024. '*************************************************************************
  3025.    if FInitializeCopyList(szChpt$, GetSymbolValue(SYM_STF_SRCDIR$), CLng(nField%)) = 0 then
  3026.       ErrorMsg 0, "Error initializing the copylist: " + szChpt$
  3027.       ERROR STFQUIT
  3028.    end if
  3029. END SUB
  3030.  
  3031. '***********************************************************************
  3032. PUBLIC SUB Lot_TurnOffAllNodeOptSections
  3033. '**
  3034. '**Turns off all node options sections in copy list
  3035. '**Normally these get turned off and on by the callback
  3036. '**But Suit needs to be able to turn them all off without
  3037. '**surfacing the dialog
  3038. '**
  3039. '**No registration functions performed, just killing 
  3040. '**the sections in the copylist
  3041. '**
  3042. DIM AllProdNum%, prodNum%, AllOptNum%, chpt$, j%, OptKeyWord$
  3043. DIM notused%
  3044.  
  3045.     'Loop through the products and find the avail node options
  3046.   AllProdNum% = 0
  3047.   AllProdNum% = Reg_GetNumberOfProducts()
  3048.   IF AllProdNum% <> 0 THEN
  3049.     'Loop through the products
  3050.     FOR prodNum%=1 TO AllProdNum%
  3051.       AllOptNum% = 0
  3052.       AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  3053.       chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%)_
  3054.         + gTOP$)
  3055.       IF AllOptNum% <> 0 THEN
  3056.         ' Loop through the options
  3057.         FOR j% = 1 TO AllOptNum%
  3058.           OptKeyWord$ = Reg_GetNodeOptionStr(prodNum%,j%)
  3059.           chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  3060.           notused% = Lot_SetChapterFilesInCopyListInOrOut(chpt$, 0)
  3061.         NEXT
  3062.       END IF
  3063.     NEXT
  3064.   END IF
  3065. END SUB
  3066.  
  3067. '*************************************************************************
  3068.  
  3069. PUBLIC SUB Lot_InitializeWinWinsysSym () 
  3070. '** Purpose: Sets win and winsys symbols
  3071. '** Author:  MZ
  3072. '*************************************************************************
  3073. DIM systemDir$
  3074.  
  3075.    'Set Windows directory symbol
  3076.    systemDir$ = GetWindowsDir()
  3077.    SetSymbolValue SYM_WINDIR$, systemdir$
  3078.  
  3079.    'Get Windows System directory
  3080.    systemDir$ = GetWindowsSysDir()
  3081.  
  3082.    'Check if I can write to the window system dir. and set winsysdir symbol
  3083.    IF(IsDirWritable(systemDir$)) = 1 THEN
  3084.       SetSymbolValue SYM_WINSYSDIR$, systemDir$
  3085.    ELSE
  3086.       SetSymbolValue SYM_WINSYSDIR$, GetWindowsDir()
  3087.    END IF
  3088. END SUB
  3089.  
  3090. ''* INitialize the gEXTRA LIST to 200000 bytes for the windows drive.
  3091. PUBLIC SUB Lot_InitializeEXTRA
  3092.     DIM drv$, drvno%, i%
  3093.    '' Add extra "FUDGE" space on Windows drive to allow for activities
  3094.    '' in windows directory.
  3095.    If GetListLength(gEXTRA) = 0 Then
  3096.       drv$ = Lot_ExtractDriveLetter(GetWindowsDir())
  3097.       drvno% = ASC(drv$) - ASC("a") + 1
  3098.       FOR i% = 1 to 26
  3099.      If i% = drvno% Then
  3100.         AddlistItem gEXTRA, "200000"
  3101.      Else
  3102.         AddlistItem gEXTRA, ""
  3103.      End If
  3104.       NEXT
  3105.    End If
  3106. END SUB
  3107.  
  3108. PUBLIC SUB Lot_RefreshDestination (symbol$) 
  3109. '** Purpose:
  3110. '** Author:
  3111. '** Arguments:
  3112. '** Returns:
  3113. '**     
  3114. '*************************************************************************
  3115.    if FRefreshDestination(symbol$) = FALSE THEN
  3116.       ErrorMsg 0, "Lot_RefreshDestination error: " + symbol$
  3117.       ERROR STFQUIT
  3118.    end if
  3119. END SUB
  3120.  
  3121. '*************************************************************************
  3122. PUBLIC SUB Lot_WriteDestinationSymAndVal (IniFileName$,IniSection$) 
  3123. '** Purpose:
  3124. '** Author:
  3125. '** Arguments:
  3126. '** Returns:
  3127. '**     
  3128. '*************************************************************************
  3129.    if FWriteDestinationSymAndVal(IniFileName$,IniSection$) = FALSE THEN
  3130.       ErrorMsg 0, "Lot_WriteDestinationSymAndVal error."
  3131.       ERROR STFQUIT
  3132.    end if
  3133. END SUB
  3134. '*************************************************************************
  3135.  
  3136. PUBLIC SUB Lot_GetDriveFreeSpaceList (szSymbol$)
  3137. '** Purpose: Creates a list of available drives, with space available
  3138. '** Author:
  3139. '** Arguments: sySymbol$        Name of list
  3140. '**     
  3141. '*************************************************************************
  3142. DIM     i%, nd%, rc$
  3143.    if FGetDriveFreeSpaceList(szSymbol$) = FALSE THEN
  3144.       ErrorMsg SID_ERR_LOT_GDFSL, ""
  3145.       ERROR STFQUIT
  3146.    end if
  3147. END SUB
  3148.  
  3149. PUBLIC FUNCTION Lot_AddToDriveFreeSpaceList (szSymbol$, szNewItem$) AS LONG
  3150. '** Purpose:Add a drive to a drive free space combo control 
  3151. '** Author:GJL
  3152. '** Arguments:szSymbol$ symbol for combo control
  3153. '**             szNewItem$ drive or UNC volume to add
  3154. '** Returns:TRUE if successful 
  3155. '**     
  3156. '*************************************************************************
  3157. DIM ret&
  3158.    ret& = FAddToDriveFreeSpaceList(szSymbol$, szNewItem$)
  3159.    IF ret& = 0 THEN
  3160.     Lot_AddToDriveFreeSpaceList = FALSE
  3161.    ELSE
  3162.     Lot_AddToDriveFreeSpaceList  = TRUE
  3163.    END IF
  3164. END FUNCTION
  3165. '*************************************************************************
  3166.  
  3167.  
  3168. '**UNC stuff
  3169. PUBLIC FUNCTION Lot_IsUnvalidatedUNCPath(szPath$) AS LONG
  3170. '** Purpose:Checks for 2 leading backslashes on a path
  3171. '** Author:GJL
  3172. '** Arguments:szPath$ a path
  3173. '** Returns:
  3174. '**     
  3175. '*************************************************************************
  3176.    IF FIsUnvalidatedUNCPath(szPath$) = 1 THEN
  3177.     Lot_IsUnvalidatedUNCPath = TRUE
  3178.    ELSE   
  3179.     Lot_IsUnvalidatedUNCPath = FALSE
  3180. END IF
  3181. END FUNCTION
  3182.  
  3183. PUBLIC FUNCTION Lot_IsValidUNCPath(szPath$) AS LONG
  3184. '** Purpose:determine whether a UNC volume is valid
  3185. '** Author:GJL
  3186. '** Arguments:A UNC volume with no trailing backslash
  3187. '** Returns:
  3188. '**     
  3189. '*************************************************************************
  3190.    IF FIsValidUNCPath(szPath$) = 1 THEN
  3191.     Lot_IsValidUNCPath = TRUE
  3192.    ELSE
  3193.     Lot_IsValidUNCPath = FALSE
  3194.    END IF
  3195. END FUNCTION
  3196.  
  3197. '**end UNC stuff
  3198.  
  3199.  
  3200. PUBLIC FUNCTION PopupModelessDlg (Dlg%, HelpID&) AS STRING
  3201. '** Purpose:
  3202. '** Author:
  3203. '** Arguments:
  3204. '** Returns:
  3205. '*************************************************************************
  3206.    DIM cuidll$, szWnd$, notused$, notused1%
  3207.  
  3208.  '-   cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3209.  ' JMD
  3210.  ' SYM_CUIDLL is now a list of DLLs
  3211.  ' First one contains code (dialog procs) and common resources
  3212.  ' Others contain product specific resources
  3213.  'NOTE: common DLL MUST be listed FIRST in the INI file
  3214.  '------------------------------
  3215.     cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3216.  
  3217.    'UIStartDlg(cuidll$, Dlg&, "FNameOrgDlgProc", APPHELP, "FHelpDlgProc")
  3218.    notused$ = UIStartDlg(cuidll$, Dlg%, FNAMEORGDLGPROC$, 0, "")
  3219.  
  3220.    ''Make sure the dialog gets fully painted
  3221.    szWnd$ = GetSymbolValue(SYM_WNDHANDLE$)
  3222.    notused1% = SendMessage(VAL(szWnd$),UM_PAINTMODELESS,0,0)
  3223. END FUNCTION
  3224.  
  3225. PUBLIC FUNCTION PopupWithFunction (Dlg%, HelpID&, Func$) AS STRING
  3226. '** Purpose:   Surface modal dialog box
  3227. '** Author:
  3228. '** Arguments:  Dlg%      ID of dialog template
  3229. '**             HelpID&   ID of help topic
  3230. '**             Func$     Dialog procedure name
  3231. '** Returns:     Exit string
  3232. '*************************************************************************
  3233.     DIM cuidll$, sz$, cdir$, notused%
  3234.  
  3235.  ' JMD
  3236.  ' SYM_CUIDLL is now a list of DLLs
  3237.  ' First one contains code (dialog procs) and common resources
  3238.  ' Others contain product specific resources
  3239.  'NOTE: common DLL MUST be listed FIRST in the INI file
  3240.  '------------------------------
  3241.  
  3242.     If GetSymbolValue(SYM_AUTOMATIONINST$) = gTRUE$ Then EXIT FUNCTION
  3243.     
  3244.     cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3245.     DO
  3246.         sz$ = UIStartDlg(cuidll$, Dlg%, Func$, 0, "")
  3247.  
  3248.         SELECT CASE sz$
  3249.         case "IDC_EXIT"
  3250.             notused% = FRemoveSymbol("IDC_TEXT")
  3251.             QUIT
  3252.             SetListItem "__DLG_ID", 1, STR(Dlg%)
  3253.         case "IDC_CANCEL" 
  3254.             EXIT DO
  3255.         case "IDC_CONTINUE" 
  3256.             EXIT DO
  3257.         case "IDC_OK" 
  3258.             EXIT DO
  3259.         case "IDC_MENU"
  3260.             EXIT DO
  3261.         case "IDC_BACK"
  3262.             EXIT DO
  3263.         case "IDC_CITHELP"
  3264.             cdir$ = GetSymbolValue(SYM_STF_CWDDIR$) + gINSTALLHLP$
  3265.             notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_CONTEXT, HelpID&)
  3266.             SetListItem "RETFROMHELP", 1, "T"
  3267.         case "HELPKEY" 
  3268.             cdir$ = GetSymbolValue(SYM_STF_CWDDIR$) + gINSTALLHLP$
  3269.             notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_CONTEXT, HelpID&)
  3270.             SetListItem "RETFROMHELP", 1, "T"
  3271.         END SELECT
  3272.     LOOP
  3273.     PopupWithFunction = MID$(sz$,5,LEN(sz$)-4)
  3274.     UIPop 1
  3275.     notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_QUIT, HelpID&)
  3276. END FUNCTION
  3277.  
  3278. PUBLIC FUNCTION PopupModalDlg (Dlg%, HelpID&) AS STRING
  3279. '** Purpose:
  3280. '** Author:
  3281. '** Arguments:
  3282. '** Returns:
  3283. '*************************************************************************
  3284.     PopupModalDlg=PopupWithFunction(Dlg%, HelpID&, FNAMEORGDLGPROC$)
  3285. END FUNCTION
  3286.  
  3287. PUBLIC FUNCTION RegisterCallback (ModName$, FuncName$) AS INTEGER
  3288. '** Purpose:
  3289. '** Author:
  3290. '** Arguments:
  3291. '** Returns:
  3292. '*************************************************************************
  3293.   DIM rc%, automation$
  3294.  
  3295.   automation$ = GetSymbolValue(SYM_AUTOMATIONINST$)
  3296.   If  automation$ <> gTRUE$ Then
  3297.     RemoveSymbol(SYM_CALLBACK$)
  3298.     AddListItem SYM_CALLBACK$, FuncName$
  3299.     rc% = RegisterFunction(LSI_INFO(4),ModName$,FuncName$)
  3300.     If rc% = -4 Then
  3301.       ErrorMsg 0, "Maximum Number of Callbacks exceeded"
  3302.     End If
  3303.   End If
  3304. END FUNCTION
  3305.  
  3306. '*************************************************************************
  3307. '** FUNCTION SelectDriveCombo (ComboID$, path$)
  3308. '** Purpose:    Sets the ComboID dropdown to drive$
  3309. '**
  3310. '** IN SYMBOLS   Expects SYM_UPDATELIST$ to have an "ALL" entry
  3311. '**                 otherwise dropdown combo code asserts
  3312. '** OUT SYMBOLS  Adds 2 entries to the UPDATELIST 
  3313. '**     
  3314. '** Author:  Marcel Meth
  3315. '** Arguments:    ComboId$ - Id of the combo being set e.g. "IDC_COMBO1"
  3316. '**               path$ - Path that includes a drive letter or UNC vol.
  3317. '**     
  3318. '** If drive is not in combo box it will be added 
  3319. '**
  3320. '** Returns:  Index of the drive letter in the combo
  3321. '**     
  3322. '*************************************************************************
  3323. PUBLIC FUNCTION SelectDriveCombo (ComboID$, path$) AS INTEGER
  3324.    DIM n%, i%, drv$, dirpath$, position&, addRet&
  3325.    DIM FirstDriveLetter$
  3326.  
  3327.    n% = GetListLength(ComboID$)
  3328.    SelectDriveCombo = 1
  3329.    drv$ = Lot_ExtractDriveLetter(path$)
  3330. '** 
  3331. '** UNC path
  3332. '** 
  3333.    IF drv$ = "\" THEN
  3334.      Lot_SplitUNCPath path$, drv$, dirpath$
  3335.      IF Lot_IsvalidUNCPath(drv$) = FALSE THEN
  3336.        SelectDriveCombo = FALSE
  3337.        Exit FUNCTION
  3338.      END IF
  3339.      For i% = 1 to n%
  3340.        position& = InStr(LCASE$(GetListItem(ComboID$, i%)), LCASE$(drv$)) 
  3341.        If 0 < position Then
  3342.      AddListItem SYM_UPDATELIST$, ComboID$ 
  3343.      AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3344.      SelectDriveCombo = i%
  3345.      EXIT FUNCTION
  3346.        End If
  3347.      NEXT
  3348.      addRet& = Lot_AddToDriveFreeSpaceList(ComboID$, drv$)
  3349.      IF addRet&  = TRUE THEN
  3350.        i% = GetListLength(ComboID$)
  3351.        AddListItem SYM_UPDATELIST$, ComboID$ 
  3352.        AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3353.        SelectDriveCombo = i%
  3354.      ELSE 
  3355.        SelectDriveCombo = FALSE
  3356.      END IF
  3357. '** 
  3358. '** Drive letter given
  3359. '** 
  3360.    ELSE
  3361.      For i% = 1 to n%
  3362.        If drv$ = LCASE$(MID(GetListItem(ComboID$, i%), 1, 1)) Then
  3363.      AddListItem SYM_UPDATELIST$, ComboID$ 
  3364.      AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3365.      SelectDriveCombo = i% 
  3366.      EXIT FUNCTION
  3367.        End If
  3368.      Next
  3369. '** 
  3370. '** Drive not found in list
  3371. '** 
  3372.      IF Lot_AddToDriveFreeSpaceList(ComboID$, drv$)  = FALSE THEN
  3373.        SelectDriveCombo = FALSE
  3374.      ELSE
  3375.        i% = GetListLength(ComboID$)
  3376.        AddListItem SYM_UPDATELIST$, ComboID$ 
  3377.        AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3378.        SelectDriveCombo = i%
  3379.      END IF
  3380.    END IF
  3381.  
  3382. END FUNCTION
  3383.  
  3384. PUBLIC FUNCTION CheckForSpace(DlgId%) AS INTEGER
  3385. '** Purpose: Checks to see if there is enough space on dest directories
  3386. '**          First does a cheap check, followed, if need be by a high
  3387. '**          granularity check.
  3388. '** Author: Marcel Meth
  3389. '** Arguments:
  3390. '**     
  3391. '**     
  3392. '** Returns: SUCCESS/FAILURE
  3393. '**     
  3394. '*************************************************************************
  3395.     DIM lTicks&, lcb&, lNew&, i%, j%, lcbNeed&, dr$, s$, helpId&, rc$
  3396.     DIM notused1$, curcursor&, UNCSym$
  3397.  
  3398.    '** Try a quick check
  3399.    CheckForSpace = SUCCESS
  3400.    lTicks&       = GetTickCount()
  3401.    lcb&          = LcbGetChapterCost("", "", SYM_COST$, SYM_NEEDED$)
  3402.    IF lcb& = CLNG(0) THEN
  3403.       DO '** Keep the modeless up at least 2 seconds
  3404.      lNew& = GetTickCount()
  3405.       LOOP UNTIL (lNew& - lTicks&) > 2000
  3406.       DisplayWhenSpaceIsTight SYM_COST$, SYM_NEEDED$
  3407.       GOTO ENDCHECK
  3408.    END IF
  3409.    '** Try A High Granularity Check
  3410.    curcursor& = ShowWaitCursor()
  3411.    SetListItem "IDC_BMP", 1, STR$(IDD_MAXSCAN_BMP) '** put up the bitmap
  3412.    notused1$ = PopupModelessDlg(DB_CHECKSPACE, DB_CHECKSPACE)
  3413.    lcb& = GetCopyListCost (gEXTRA, SYM_COST$, SYM_NEEDED$)
  3414.    UIPOP 1     '** Bring down DB_CHECKSPACE
  3415.    RestoreCursor curcursor&
  3416.    IF lcb& = CLNG(0) THEN
  3417.       DisplayWhenSpaceIsTight SYM_COST$, SYM_NEEDED$
  3418.       GOTO ENDCHECK
  3419.    END IF
  3420.  
  3421.    '** If you get here then there was not enough space (Tab is CHR$(9))
  3422.    CheckForSpace = FAILURE
  3423.    RemoveSymbol "IDC_LIST1"
  3424.    FOR i% = 1 TO 26
  3425.       lcbNeed& = CLNG(GetListItem(SYM_NEEDED$, i%))
  3426.       IF  lcbNeed& > 0 THEN
  3427.      dr$ = CHR$(ASC("A")+i%-1) + ":" + CHR$(9)
  3428.      s$  = dr$ & (lcbNeed& + 4)
  3429.      AddlistItem "IDC_LIST1", s$ + gStrK$
  3430.       END IF
  3431.    NEXT
  3432.    j%=GetListLength("UNCVOLLIST")
  3433.    FOR i% = 1 to j%
  3434.       UNCSym$ = GetListItem("UNCVOLLIST",i%)
  3435.       lcbNeed& = CLNG(GetListItem(UNCSym$, 3))
  3436.       IF lcbNeed&  > 0 THEN
  3437.          IF IsDBCSFirstAtOffset(UNCSym$, 18) = 0 THEN
  3438.             s$ = Leftbp(UNCSym$, 18)
  3439.          ELSE
  3440.             s$ = Leftbp(UNCSym$, 17)
  3441.          END IF
  3442.          s$ = s$ & CHR$(9) & (lcbNeed& + 4)
  3443.      AddlistItem "IDC_LIST1", s$ + gStrK$
  3444.       END IF
  3445.    NEXT
  3446.  
  3447.  
  3448.    SetListItem "SETTABS1",1,"50"
  3449.    SetListItem "NORMALFONT", 1, STR$(IDC_TEXT1)
  3450.    SetListItem "NORMALFONT", 2, STR$(IDC_TEXT2)
  3451.    SetListItem "NORMALFONT", 3, STR$(IDC_TEXT3)
  3452.  
  3453.    helpId& = DlgId%
  3454.    rc$ = PopupModalDlg (DlgId%, helpId&)
  3455.  
  3456. ENDCHECK:
  3457.    RemoveSymbol(SYM_COST$)
  3458.    RemoveSymbol(SYM_NEEDED$)
  3459.  
  3460. END FUNCTION
  3461.  
  3462. '*************************************************************************
  3463. '** SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  3464. '**
  3465. '** Purpose:    Display a warning message when disk space is tight
  3466. '**             You should only call this sub if you think there is
  3467. '**             enough disk space. This means that we will assume that
  3468. '**             szNeed$ contains only negative numbers.
  3469. '**
  3470. '**             The message will be displayed if 110% of cost will not
  3471. '**             fit on any one disk.
  3472. '**
  3473. '** Arguments:  szCost$ and szNeed$ - Symbols for cost and need
  3474. '**             Both symbol lists are expected to contain 26 numbers
  3475. '**     
  3476. '** Author:     DND
  3477. '**     
  3478. '*************************************************************************
  3479.  
  3480. PUBLIC SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  3481.    DIM i%, lcbCost&, lcbNeed&, sz$, retcode%
  3482.    FOR i% = 1 TO 26
  3483.       lcbCost& =  (CLNG(GetListItem(szCost$, i%)) \ 1024) \ 10
  3484.       lcbNeed& = -CLNG(GetListItem(szNeed$, i%))
  3485.       IF lcbCost& > lcbNeed& THEN
  3486.      sz$ = LdString(SID_WARN_DISKSPACE1) + _
  3487.            LdString(SID_WARN_DISKSPACE2) + _
  3488.            LdString(SID_WARN_DISKSPACE3)
  3489.      'MessageBox sz$, MB_OK+MB_ICONINFORMATION, LdString(SID_TKT_STD_TITLE)
  3490.      retcode% = DoMsgBox(sz$,LdString(SID_TKT_STD_TITLE),MB_OKCANCEL _
  3491.                    +MB_ICONINFORMATION)
  3492.             if retcode% = IDCANCEL then
  3493.                 QUIT
  3494.             end if
  3495.      EXIT FOR
  3496.       END IF
  3497.    NEXT
  3498.  
  3499. END SUB
  3500.  
  3501. '******** Microsoft Functions that Lotus re-wrote **************************
  3502.  
  3503.  
  3504.  
  3505. PUBLIC SUB ReadInfFile (szFile$) 
  3506. '** Purpose:
  3507. '** Author:
  3508. '** Arguments: szFile$
  3509. '*************************************************************************
  3510. %rem
  3511. '    if FValidFATPath(szFile$) = 0 then
  3512. '        BadArgErr 1, "ReadInfFile", szFile$
  3513. '    end if
  3514. '    IF FOpenInf(szFile$, 1, 1) = 0 THEN
  3515. '        StfApiErr saeFail, "ReadInfFile", szFile$
  3516. %endrem
  3517.     IF FOpenInf(szFile$, 1, 0) = 0 THEN
  3518.     ErrorMsg SID_ERR_READINFFILE, ""
  3519.     ERROR STFQUIT
  3520.     END IF
  3521. END SUB
  3522.  
  3523. PUBLIC SUB MakeListFromSectionKeys(szSymbol$, szSect$) 
  3524. '** Purpose:
  3525. '** Author:
  3526. '** Arguments: szSymbol$, szSect$
  3527. '*************************************************************************
  3528. %rem
  3529.     if szSymbol$ = "" then
  3530.     n% = 1
  3531.     elseif FValidInfSect(szSect$) = 0 then
  3532.     n% = 2
  3533.     else
  3534.     n% = 0
  3535.     end if
  3536.     if n% > 0 then
  3537.     BadArgErr n%, "MakeListFromSectionKeys", szSymbol$+", "+szSect$
  3538.     end if
  3539. %endrem ''DEBUG
  3540.  
  3541.     IF FSetSymbolToListOfInfKeys(szSymbol$, szSect$, 1) = 0 THEN
  3542.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONKEYS, ""
  3543.     ERROR STFQUIT
  3544.     END IF
  3545. END SUB
  3546.  
  3547. PUBLIC SUB MakeListFromSectionDate (szSym$, szSect$) 
  3548. '** Purpose:
  3549. '** Author:
  3550. '** Arguments: szSym$, szSect$
  3551. '** Returns:
  3552. '**     
  3553. '*************************************************************************
  3554. %rem
  3555.     if szSym$ = "" then
  3556.     n% = 1
  3557.     elseif FValidInfSect(szSect$) = 0 then
  3558.     n% = 2
  3559.     else
  3560.     n% = 0
  3561.     end if
  3562.     if n% > 0 then
  3563.     BadArgErr n%, "MakeListFromSectionDate", szSym$+", "+szSect$
  3564.     end if
  3565. %endrem ''DEBUG
  3566.  
  3567.     IF FMakeListInfSectionField(szSym$, szSect$, 5) = 0 THEN
  3568.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONDATE, ""
  3569.     ERROR STFQUIT
  3570.     END IF
  3571. END SUB
  3572.  
  3573. PUBLIC SUB MakeListFromSectionFilename (szSym$, szSect$) 
  3574. '** Purpose:
  3575. '** Author:
  3576. '** Arguments: szSym$, szSect$
  3577. '** Returns:
  3578. '**     
  3579. '*************************************************************************
  3580. %rem
  3581.     if szSym$ = "" then
  3582.     n% = 1
  3583.     elseif FValidInfSect(szSect$) = 0 then
  3584.     n% = 2
  3585.     else
  3586.     n% = 0
  3587.     end if
  3588.     if n% > 0 then
  3589.     BadArgErr n%, "MakeListFromSectionFilename", szSym$+", "+szSect$
  3590.     end if
  3591. %endrem ''DEBUG
  3592.  
  3593.     IF FMakeListInfSectionField(szSym$, szSect$, 1) = 0 THEN
  3594.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONFILENAME, ""
  3595.     ERROR STFQUIT
  3596.     END IF
  3597. END SUB
  3598.  
  3599. PUBLIC SUB MakeListFromSectionSize (szSym$, szSect$) 
  3600. '** Purpose:
  3601. '** Author:
  3602. '** Arguments: szSym$, szSect$
  3603. '** Returns:
  3604. '**     
  3605. '*************************************************************************
  3606. %rem
  3607.     if szSym$ = "" then
  3608.     n% = 1
  3609.     elseif FValidInfSect(szSect$) = 0 then
  3610.     n% = 2
  3611.     else
  3612.     n% = 0
  3613.     end if
  3614.     if n% > 0 then
  3615.     BadArgErr n%, "MakeListFromSectionSize", szSym$+", "+szSect$
  3616.     end if
  3617. %endrem ''DEBUG
  3618.  
  3619.     IF FMakeListInfSectionField(szSym$, szSect$, 15) = 0 THEN
  3620.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONSIZE, ""
  3621.     ERROR STFQUIT
  3622.     END IF
  3623. END SUB
  3624.  
  3625. PUBLIC SUB MakeListFromSectionVersion (szSym$, szSect$) 
  3626. '** Purpose:
  3627. '** Author:
  3628. '** Arguments: szSym$, szSect$
  3629. '** Returns:
  3630. '**     
  3631. '*************************************************************************
  3632. %rem
  3633.     if szSym$ = "" then
  3634.     n% = 1
  3635.     elseif FValidInfSect(szSect$) = 0 then
  3636.     n% = 2
  3637.     else
  3638.     n% = 0
  3639.     end if
  3640.     if n% > 0 then
  3641.     BadArgErr n%, "MakeListFromSectionVersion", szSym$+", "+szSect$
  3642.     end if
  3643. %endrem ''DEBUG
  3644.  
  3645.     IF FMakeListInfSectionField(szSym$, szSect$, 19) = 0 THEN
  3646.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONVERSION, ""
  3647.     ERROR STFQUIT
  3648.     END IF
  3649. END SUB
  3650.  
  3651. PUBLIC FUNCTION SetSilentMode (mode%)  AS INTEGER
  3652. '** Purpose:
  3653. '** Author:
  3654. '** Arguments: mode%
  3655. '** Returns:
  3656. '**     
  3657. '*************************************************************************
  3658.     DIM temp&
  3659.  
  3660.     temp& = CLNG ( mode% )
  3661.     SetSilentMode = FSetSilent( temp& )
  3662. END FUNCTION
  3663.  
  3664. PUBLIC FUNCTION SetBeepingMode (mode%)  AS INTEGER
  3665. '** Purpose:
  3666. '** Author:
  3667. '** Arguments: mode%
  3668. '** Returns:
  3669. '**     
  3670. '*************************************************************************
  3671.     DIM temp&
  3672.  
  3673.     temp& = CLNG ( mode% )
  3674.  
  3675.     SetBeepingMode = FSetBeepingMode( temp& )
  3676. END FUNCTION
  3677.  
  3678. PUBLIC FUNCTION GetSectionKeyDate (szSect$, szKey$)  AS STRING
  3679. '** Purpose:
  3680. '** Author:
  3681. '** Arguments: szSect$, szKey$
  3682. '** Returns:
  3683. '**     
  3684. '*************************************************************************
  3685. %rem
  3686.     if FValidInfSect(szSect$) = 0 then
  3687.     n% = 1
  3688.     elseif szKey$ = "" then
  3689.     n% = 2
  3690.     else
  3691.     n% = 0
  3692.     end if
  3693.     if n% > 0 then
  3694.     BadArgErr n%, "GetSectionKeyDate", szSect$+", "+szKey$
  3695.     end if
  3696. %endrem ''DEBUG
  3697.     DIM szBuf$, Length&
  3698.  
  3699.     szBuf$ = string$(128, 32) 
  3700.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 5, szBuf$, 128)
  3701.     IF Length& >= 128 THEN
  3702.     ErrorMsg SID_ERR_GETSECTIONKEYDATE, ""
  3703.     ERROR STFQUIT
  3704.     END IF
  3705.  
  3706.     IF Length& = -1 THEN
  3707.     ErrorMsg SID_ERR_GETSECTIONKEYDATE2, ""
  3708.     ERROR STFQUIT
  3709.     END IF
  3710.  
  3711.     GetSectionKeyDate = LEFT$ (szBuf$, CInt(Length&))
  3712.     szBuf$ = ""
  3713. END FUNCTION
  3714.  
  3715. PUBLIC FUNCTION GetSectionKeyFilename (szSect$, szKey$)  AS STRING
  3716. '** Purpose:
  3717. '** Author:
  3718. '** Arguments: szSect$, szKey$
  3719. '** Returns:
  3720. '**     
  3721. '*************************************************************************
  3722. %rem
  3723.     if FValidInfSect(szSect$) = 0 then
  3724.     n% = 1
  3725.     elseif szKey$ = "" then
  3726.     n% = 2
  3727.     else
  3728.     n% = 0
  3729.     end if
  3730.     if n% > 0 then
  3731.     BadArgErr n%, "GetSectionKeyFilename", szSect$+", "+szKey$
  3732.     end if
  3733. %endrem ''DEBUG
  3734.     DIM szBuf$, Length&
  3735.  
  3736.     szBuf$ = string$(128, 32)
  3737.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 1, szBuf$, 128)
  3738.     IF Length& >= 128 THEN
  3739.     ErrorMsg SID_ERR_GETSECTIONKEYFILENAME, ""
  3740.     ERROR STFQUIT
  3741.     END IF
  3742.  
  3743.     IF Length& = -1 THEN
  3744.     ErrorMsg SID_ERR_GETSECTIONKEYFILENAME2, ""
  3745.     ERROR STFQUIT
  3746.     END IF
  3747.  
  3748.     GetSectionKeyFilename = LEFT$ (szBuf$, CInt(Length&) )
  3749.     szBuf$ = ""
  3750. END FUNCTION
  3751.  
  3752. PUBLIC FUNCTION GetSectionKeySize (szSect$, szKey$)  AS LONG
  3753. '** Purpose:
  3754. '** Author:
  3755. '** Arguments: szSect$, szKey$
  3756. '** Returns:
  3757. '**     
  3758. '*************************************************************************
  3759. %rem
  3760.     if FValidInfSect(szSect$) = 0 then
  3761.     n% = 1
  3762.     elseif szKey$ = "" then
  3763.     n% = 2
  3764.     else
  3765.     n% = 0
  3766.     end if
  3767.     if n% > 0 then
  3768.     BadArgErr n%, "GetSectionKeySize", szSect$+", "+szKey$
  3769.     end if
  3770. %endrem ''DEBUG
  3771.     DIM szBuf$, Length&
  3772.  
  3773.     szBuf$ = string$(128, 32)
  3774.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 15, szBuf$, 128)
  3775.     IF Length& >= 128 THEN
  3776.     ErrorMsg SID_ERR_GETSECTIONKEYSIZE, ""
  3777.     ERROR STFQUIT
  3778.     END IF
  3779.  
  3780.     IF Length& = -1 THEN
  3781.     ErrorMsg SID_ERR_GETSECTIONKEYSIZE2, ""
  3782.     ERROR STFQUIT
  3783.     END IF
  3784.     
  3785.     GetSectionKeySize = VAL (LEFT$ (szBuf$, CInt(Length&)) )
  3786.     szBuf$ = ""
  3787. END FUNCTION
  3788.  
  3789. PUBLIC FUNCTION GetSectionKeyVersion (szSect$, szKey$)  AS STRING
  3790. '** Purpose:
  3791. '** Author:
  3792. '** Arguments: szSect$, szKey$
  3793. '** Returns:
  3794. '**     
  3795. '*************************************************************************
  3796. %rem
  3797.     if FValidInfSect(szSect$) = 0 then
  3798.     n% = 1
  3799.     elseif szKey$ = "" then
  3800.     n% = 2
  3801.     else
  3802.     n% = 0
  3803.     end if
  3804.     if n% > 0 then
  3805.     BadArgErr n%, "GetSectionKeyVersion", szSect$+", "+szKey$
  3806.     end if
  3807. %endrem ''DEBUG
  3808.     DIM szBuf$, Length&
  3809.  
  3810.     szBuf$ = string$(128, 32) 
  3811.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 19, szBuf$, 128)
  3812.     IF Length& >= 128 THEN
  3813.     ErrorMsg SID_ERR_GETSECTIONKEYVERSION, ""
  3814.     ERROR STFQUIT
  3815.     END IF
  3816.  
  3817.     IF Length& = -1 THEN
  3818.     ErrorMsg SID_ERR_GETSECTIONKEYVERSION2, ""
  3819.     ERROR STFQUIT
  3820.     END IF
  3821.  
  3822.     GetSectionKeyVersion = LEFT$ (szBuf$, CInt(Length&))
  3823.     szBuf$ = ""
  3824. END FUNCTION
  3825.  
  3826. PUBLIC SUB RemoveDir (szDir$, cmo%) 
  3827. '** Purpose:
  3828. '** Author:
  3829. '** Arguments: szDir$, cmo%
  3830. '*************************************************************************
  3831. %rem
  3832.     if FValidFATDir(szDir$) = 0 then
  3833.     BadArgErr 1, "RemoveDir", szDir$+", "+STR$(cmo%)
  3834.     end if
  3835. %endrem ''DEBUG
  3836.     IF FRemoveDir(szDir$) = 0 THEN
  3837.     ErrorMsg SID_ERR_REMOVEDIR, ""
  3838.     ERROR STFERR
  3839.     END IF
  3840. END SUB
  3841.  
  3842. PUBLIC SUB DumpCopyList (szFile$) 
  3843. '** Purpose:
  3844. '** Author:
  3845. '** Arguments: szFile$
  3846. '*************************************************************************
  3847. %rem
  3848.     if szFile$ = "" then
  3849.     BadArgErr 1, "DumpCopyList", szFile$
  3850.     end if
  3851. %endrem ''DEBUG
  3852.     IF FDumpCopyListToFile (szFile$) = 0 THEN
  3853.     ErrorMsg SID_ERR_DUMPCOPYLIST, ""
  3854.     ERROR STFERR
  3855.     END IF
  3856. END SUB
  3857.  
  3858. PUBLIC SUB ClearCopyList 
  3859. '** Purpose:
  3860. '** Author:
  3861. '** Arguments: None
  3862. '*************************************************************************
  3863.     ResetCopyList
  3864. END SUB
  3865.  
  3866. PUBLIC FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$)  AS LONG
  3867. '** Purpose:
  3868. '** Author:
  3869. '** Arguments: szExtraList$, szCostList$, szNeedList$
  3870. '** Returns:
  3871. '**     
  3872. '*************************************************************************
  3873.     DIM lNeed&
  3874.  
  3875.     lNeed& = LcbGetCopyListCost (szExtraList$, szCostList$, szNeedList$)
  3876.     IF lNeed& < 0 THEN
  3877.     ErrorMsg SID_ERR_GETCOPYLISTCOST, ""
  3878.     ERROR STFQUIT
  3879.     END IF
  3880.     GetCopyListCost = lNeed&
  3881. END FUNCTION
  3882.  
  3883. PUBLIC SUB CopyFilesInCopyList 
  3884. '** Purpose:
  3885. '** Author:
  3886. '** Arguments:
  3887. '** Returns:
  3888. '**     
  3889. '*************************************************************************
  3890.     DIM grc&, notused%
  3891.  
  3892.     notused% = RemovePriorVersion("begin","execution")
  3893.  
  3894.     grc& = GrcCopyFilesInCopyList (HinstFrame())
  3895.  
  3896.     IF grc& = grcUserQuit THEN
  3897.     ErrorMsg SID_ERR_NOT_COMPLETE, ""
  3898.     ERROR STFQUIT
  3899.     ELSEIF grc& > 0 THEN
  3900.     ErrorMsg SID_ERR_NOT_COMPLETE, ""
  3901.     ERROR STFQUIT
  3902.     END IF
  3903. END SUB
  3904.  
  3905. PUBLIC SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$) 
  3906. '** Purpose:
  3907. '** Author:
  3908. '** Arguments:
  3909. '** Returns:
  3910. '**     
  3911. '*************************************************************************
  3912. %rem
  3913.     if FValidInfSect(szSect$) = 0 then
  3914.     n% = 1
  3915.     elseif FValidFATDir(szSrc$) = 0 then
  3916.     n% = 2
  3917.     elseif FValidFATDir(szDest$) = 0 then
  3918.     n% = 3
  3919.     else
  3920.     n% = 0
  3921.     end if
  3922.     if n% > 0 then
  3923.     BadArgErr n%, "AddSectionFilesToCopyList", szSect$+", "+szSrc$+", "+szDest$
  3924.     end if
  3925. %endrem ''DEBUG
  3926.  
  3927.     IF FAddSectionFilesToCopyList (szSect$, szSrc$, szDest$) = 0 THEN
  3928.  
  3929.     ErrorMsg SID_ERR_ADDSECTIONFILESTOCOPYLIST, ""
  3930.     ERROR STFQUIT
  3931.     END IF
  3932. END SUB
  3933. '*************************************************************************
  3934.  
  3935. PUBLIC SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) 
  3936. '** Purpose:
  3937. '** Author:
  3938. '** Arguments:
  3939. '** Returns:
  3940. '**     
  3941. '*************************************************************************
  3942. %rem
  3943.     if FValidInfSect(szSect$) = 0 then
  3944.     n% = 1
  3945.     elseif szKey$ = "" then
  3946.     n% = 2
  3947.     elseif FValidFATDir(szSrc$) = 0 then
  3948.     n% = 3
  3949.     elseif FValidFATDir(szDest$) = 0 then
  3950.     n% = 4
  3951.     else
  3952.     n% = 0
  3953.     end if
  3954.     if n% > 0 then
  3955.     BadArgErr n%, "AddSectionKeyFileToCopyList", szSect$+", "+szKey$+", "+szSrc$+", "+szDest$
  3956.     end if
  3957. %endrem ''DEBUG
  3958.  
  3959.     IF FAddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  3960.     ErrorMsg SID_ERR_ADDSECTIONKEYFILETOCOPYLIST, ""
  3961.     ERROR STFQUIT
  3962.     END IF
  3963. END SUB
  3964.  
  3965. PUBLIC SUB AddToBillboardList (szDll$, idDlg&, szProc$, lTicks&) 
  3966. '** Purpose:
  3967. '** Author:
  3968. '** Arguments:
  3969. '** Returns:
  3970. '**     
  3971. '** NOTE: Argument szProc$ not used -- retained for backward compatibility
  3972. '*************************************************************************
  3973. DIM rc&,i%, Dll$
  3974. %rem
  3975.     if szDll$ = "" then
  3976.     n% = 1
  3977.     elseif idDlg& = 0 then
  3978.     n% = 2
  3979.     elseif szProc$ = "" then
  3980.     n% = 3
  3981.     elseif lTicks& <= 0 then
  3982.     n% = 4
  3983.     else
  3984.     n% = 0
  3985.     end if
  3986.     if n% > 0 then
  3987.     BadArgErr n%, "AddToBillboardList", szDll$+", "+STR$(idDlg&)+", "+szProc$+", "+STR$(lTicks&)
  3988.     end if
  3989. %endrem ''DEBUG
  3990.     Dll$ = FindResourceinDLL (idDlg&, RT_DIALOG)
  3991.     if Dll$ <> "" then
  3992.         IF FAddToBillboardList(Dll$, idDlg&, FNAMEORGDLGPROC$, lTicks&) <> 0 THEN
  3993.               Exit Sub
  3994.         END IF
  3995.     End if
  3996. label1:
  3997.    ErrorMsg SID_ERR_ADDTOBILLBOARDLIST, ""
  3998.    ERROR STFQUIT
  3999.  
  4000. END SUB
  4001.  
  4002. PUBLIC FUNCTION FindResourceinDLL (idDlg&, ResType%) AS STRING
  4003. '** Purpose: Traverses the list of DLLs in SYM_CUIDLL$ until it finds the
  4004. '**                             one that contains the resource
  4005. '** Author:     JMDonohue
  4006. '** Arguments:  id%     Resource id number
  4007. '** Returns:    String containing the DLL name or null string if not found
  4008. '*************************************************************************
  4009.     DIM rc&,i%, Dll$, szDlls$
  4010.     i% = 1
  4011.     szDlls$ = GetSymbolValue(SYM_CUIDLL$)
  4012.     WHILE (TRUE)
  4013.         Dll$ =  Lot_GetNthFieldFromIniString (szDlls$, i%, "") 
  4014.         if Dll$ <> "" then
  4015.            rc& = GetModuleHandle(Dll$) 
  4016.             If rc& <> 0 Then
  4017.                 rc& = FindResource(rc&, idDlg&, ResType%) 
  4018.             End If
  4019.             If rc& <> 0 Then
  4020.                 FindResourceinDLL = Dll$
  4021.                 Exit Function
  4022.             End If
  4023.         else
  4024.             FindResourceinDLL = ""
  4025.             Exit Function
  4026.         end if
  4027.         i% = i% + 1
  4028.    WEND
  4029. END FUNCTION
  4030.  
  4031. PUBLIC SUB AddBlankToBillboardList (lTicks&) 
  4032. '** Purpose:
  4033. '** Author:
  4034. '** Arguments:
  4035. '** Returns:
  4036. '**     
  4037. '*************************************************************************
  4038. %rem
  4039.     if lTicks& <= 0 then
  4040.     BadArgErr 1, "AddBlankToBillboardList", STR$(lTicks&)
  4041.     end if
  4042. %endrem ''DEBUG
  4043.     IF FAddToBillboardList("", 0, "", lTicks&) = 0 THEN
  4044.     'YYYYYYIF FAddToBillboardList(NULL, 0, NULL, lTicks&) = 0 THEN
  4045.     ErrorMsg SID_ERR_ADDBLANKTOBILLBOARDLIST, ""
  4046.     ERROR STFQUIT
  4047.     END IF
  4048. END SUB
  4049.  
  4050. PUBLIC SUB ClearBillboardList 
  4051. '** Purpose:
  4052. '** Author:
  4053. '** Arguments:
  4054. '** Returns:
  4055. '**     
  4056. '*************************************************************************
  4057.     IF FClearBillboardList() = 0 THEN
  4058.     ErrorMsg SID_ERR_CLEARBILLBOARDLIST, ""
  4059.     ERROR STFQUIT
  4060.     END IF
  4061. END SUB
  4062.  
  4063. PUBLIC SUB SetCopyGaugePosition (x%, y%) 
  4064. '** Purpose:
  4065. '** Author:
  4066. '** Arguments:
  4067. '** Returns:
  4068. '**     
  4069. '*************************************************************************
  4070.     DIM xt&, yt&
  4071.  
  4072.     xt& = CLNG ( x% )
  4073.     yt& = CLNG ( y% )
  4074.     ProSetPos xt&, yt&
  4075. END SUB
  4076.  
  4077. PUBLIC SUB QUIT
  4078. '** Purpose:
  4079. '** Author:
  4080. '** Arguments:
  4081. '*************************************************************************
  4082.    DIM sz$
  4083.  
  4084.    sz$ = PopupModalDlg (DB_EXITHISTORY, DB_EXITHISTORY)
  4085.    If sz$ = "OK" Then
  4086.       UIPopAll
  4087.         gEndStatementEncountered% = TRUE      
  4088.       END
  4089.    End If
  4090. END SUB
  4091.  
  4092.  
  4093. '*************************************************************************
  4094. '** FUNCTION Lot_WriteToRiFile(ripath$) AS INTEGER
  4095. '**            
  4096. '** Purpose:   Writes user, company and serial number in 123w.ri file. 
  4097. '** Author:    JYOTI KEDIA
  4098. '** Arguments: None
  4099. '** Returns:   SUCCESS or Failure
  4100. '*************************************************************************
  4101.  
  4102. PUBLIC FUNCTION Lot_WriteToRiFile (ripath$) AS INTEGER
  4103. DIM  uname$, cname$, snum$
  4104.  
  4105.    Lot_WriteToRiFile = TRUE
  4106.  
  4107. '** Removed all checks on length of names mmeth-8/7/95
  4108. '** C Code now truncates strings if they are too long
  4109.    uname$ = GetSymbolValue("NAME")
  4110. 'print uname$,"uname$"
  4111.    cname$ = GetSymbolValue(SYM_COMPANY$)
  4112. 'print cname$,"cname$"
  4113.    snum$  = GetSymbolValue(SYM_SERIALNUM$)
  4114.  
  4115.    IF WriteUserRegistration(ripath$,uname$,cname$,snum$) <> 0 Then
  4116.       Lot_WriteToRiFile = FALSE
  4117.    End If
  4118.  
  4119. END FUNCTION
  4120.  
  4121. '*************************************************************************
  4122. '** FUNCTION Lot_ReadDefaultsfromRi(default_ripath$) AS INTEGER
  4123. '**
  4124. '** Purpose: For standard,Server and node install reads the default user,
  4125. '**          company name and serial number from 123w.ri file. For
  4126. '**            
  4127. '** Author:    JYOTI KEDIA
  4128. '** Arguments: Sets: SYM_NAME$, SYM_COMPANY$, SYM_SERIALNUM$
  4129. '** Returns:   TURE (SUCCESS)  FALSE (FAILURE)
  4130. '*************************************************************************
  4131.  
  4132. PUBLIC FUNCTION Lot_ReadDefaultsfromRi (default_ripath$) AS INTEGER
  4133. DIM rc%, lrc&, n%
  4134.  
  4135.    DIM buf1 AS STRING : buf1 = CreateBuffer(82)   '* These strings can be upto  80
  4136.    DIM buf2 AS STRING : buf2 = CreateBuffer(82)   '* bytes not including terminator.
  4137.    DIM buf3 AS STRING : buf3 = CreateBuffer(18)   '* See lcomstf\userreg.cpp &
  4138.                           '* callback.lss:WELCOMECB
  4139.  
  4140.    Lot_ReadDefaultsfromRi = FALSE
  4141.  
  4142.    lrc& = DoesFileExist(default_ripath$,femExists)
  4143.    if lrc& = 0 goto rinotfound
  4144.  
  4145.  
  4146.    lrc& = ReadUserRegistration(default_ripath$,buf1,buf2,buf3)
  4147.    If lrc& <> 0 goto rinotfound
  4148.  
  4149.    n% = LEN(buf1)
  4150.    SetSymbolValue SYM_NAME$, LEFT$(buf1, n%)
  4151.    n% = LEN(buf2)
  4152.    SetSymbolValue SYM_COMPANY$, LEFT$(buf2, n%)
  4153.    n% = LEN(buf3)
  4154.    SetSymbolValue SYM_SERIALNUM$, LEFT$(buf3, n%)
  4155.  
  4156.    Lot_ReadDefaultsfromRi = TRUE
  4157.  
  4158.    EXIT FUNCTION
  4159.  
  4160. rinotfound: 
  4161.    
  4162. END FUNCTION
  4163.  
  4164.  
  4165. PUBLIC FUNCTION Lot_GetCurrentProduct() AS INTEGER
  4166. '** Purpose:    This function will return the current product number
  4167. '** Parameters: 
  4168. '** Return:     Product number
  4169. '*************************************************************************
  4170.    Lot_GetCurrentProduct = gCurrentProduct%
  4171. END FUNCTION
  4172.  
  4173. PUBLIC SUB Lot_SetCurrentProduct(ProdNo%) 
  4174. '** Purpose:    Set the current product number
  4175. '** Parameters: ProdNo%  the product number
  4176. '*************************************************************************
  4177.    IF ProdNo% > gMaxNumOfProds% THEN
  4178. '      ERROR STFSETERROR
  4179.       ERROR STFQUIT
  4180.    END IF
  4181.    gCurrentProduct% = ProdNo%
  4182. END SUB
  4183.  
  4184. PUBLIC FUNCTION Lot_GetInstallDir() AS STRING
  4185. '** Purpose:    Return the directory where Install will be installed.
  4186. '** Parameters: 
  4187. '** Return:     Install dir
  4188. '*************************************************************************
  4189.    DIM s$, network$
  4190.     STATIC iniDir$    
  4191.  
  4192.     'Save initial value since it may change over course of install
  4193.     IF iniDir$ = "" THEN
  4194.         s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4195.         network$ = GetSymbolValue(SYM_NETWORK$)
  4196.         IF network$ <> gNODE THEN
  4197.             IF s$ = gSMARTSUITE$ THEN
  4198.                 iniDir$ = GetSymbolValue(SYM_BASEDIR$)
  4199.             ELSE
  4200.                 s$ = Reg_GetDirSymbolList(1)     '** First product dir list
  4201.                 s$ = GetListItem(s$,1)           '** First directory symbol
  4202.                 iniDir$ = GetSymbolValue(s$)
  4203.             END IF
  4204.         ELSE
  4205.             iniDir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4206.         END IF
  4207.     END IF
  4208.     Lot_GetInstallDir = iniDir$
  4209.  
  4210. END FUNCTION
  4211.  
  4212. '** FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  4213. '**            
  4214. '** Purpose:   Retrieve the read 123 directory
  4215. '** Author:    JYOTI KEDIA
  4216. '** Arguments: None
  4217. '** Returns:   The 123 directory (with trailing backslash)
  4218. '*************************************************************************
  4219.  
  4220. PUBLIC FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  4221.    DIM sym$, prodsym$, progdir$, basedir$, l%, m%, disks$, dlen%
  4222.    
  4223.    If GetSymbolValue(SYM_NETWORK$) <> gNODE$ Then
  4224.       sym$ = Reg_GetDirSymbolList(prodno%)
  4225.       prodsym$ = GetListItem(sym$, 1)
  4226.       progdir$ = GetListItem(prodsym$,1)
  4227.    Else
  4228.       If GetSymbolValue (SYM_SINGLESMARTSUITE) =  gSINGLE$ Then
  4229.     disks$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4230.     dlen% = LEN(disks$)
  4231.     If dlen% <=0 Then
  4232.        disks$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4233.        dlen% = LEN(disks$)
  4234.      End If
  4235.     If MID$(disks$,dlen%,1) <> "\" Then
  4236.        disks$ = disks$ + "\"
  4237.     End If
  4238.     progdir$ = disks$
  4239.       Else
  4240.     '** USE THE product dir symbol, to extrapolate what
  4241.     '** the directory is on the server.
  4242.  
  4243. ''**** MMETH ???  STILL NEEDS WORK!
  4244. ''**** MMETH ???  I don't think SYMBASEDIR is always correct!
  4245.  
  4246.     sym$ = Reg_GetDirSymbolList(prodno%)
  4247.     prodsym$ = GetListItem(sym$, 1)
  4248.     progdir$ = GetListItem(prodsym$,1)
  4249.     basedir$ = GetSymbolValue (SYM_BASEDIR$)
  4250.     l% = INSTR(progdir$, basedir$)
  4251.     
  4252.     l% = INSTR(l%, progdir$, "\")
  4253.     m% = INSTR(l%, progdir$, "\")
  4254.  
  4255.     progdir$ = GetSymbolValue (SYM_INSTALL_SOURCE) +_
  4256.            RIGHT$( LEFT$ (progdir$, m%), l%)
  4257.            
  4258.       End If
  4259.    End If
  4260.  
  4261.    Lot_GetTheRealProdDir = progdir$
  4262.  
  4263. END FUNCTION
  4264.  
  4265.  
  4266. '*************************************************************************
  4267. '** FUNCTION Lot_ReadSerialNumber () AS INTEGER
  4268. '**
  4269. '** Purpose:   Reads serial number from SN.DAT and sets the symbol SERIALNUM.
  4270. '** Author:    JYOTI KEDIA
  4271. '** Arguments: None
  4272. '** Returns:   SUCCESS or FAILURE
  4273. '*************************************************************************
  4274.  
  4275. PUBLIC FUNCTION Lot_ReadSerialNumber () AS INTEGER
  4276.  
  4277.    DIM buf1 AS STRING : buf1 = CreateBuffer(18)
  4278.    DIM snpath$, rc&
  4279.  
  4280.    snpath$ = GetSymbolValue(SYM_STF_CWDDIR$)
  4281.    rc& = ReadSerialNumber(snpath$,buf1$)
  4282.    If rc& = 0 Then
  4283.       SetSymbolValue SYM_SERIALNUM$, NullTrim(buf1$)
  4284.       Lot_ReadSerialNumber = SUCCESS
  4285.    Else
  4286.       ErrorMsg SID_ERR_READSERIAL, ""
  4287.       Lot_ReadSerialNumber = FAILURE
  4288.    end if 
  4289.  
  4290. END FUNCTION
  4291.  
  4292. PUBLIC FUNCTION Lot_AreShareToolsSupported () AS INTEGER
  4293. '** Purpose:    Finds if any of the registered products supports share
  4294. '** Author:     MZ
  4295. '** Arguments:  None
  4296. '** Returns:    1 if there is at least one product that supports share
  4297. '**             0 if none of the registered prods supports share or if 
  4298. '**             no products are registered
  4299. '*************************************************************************
  4300.    DIM NumberOfProducts%,count%,ShareSupport%
  4301.    DIM network$, prod$
  4302.  
  4303.    network$ = GetSymbolValue(SYM_NETWORK$)
  4304.    ShareSupport%=0
  4305.    ' Find how many products are registered
  4306.    NumberOfProducts%=Reg_GetNumberOfProducts()
  4307.    IF(NumberOfProducts%<>0) THEN
  4308.       ' Loop through the products
  4309.       FOR count%=1 TO NumberOfProducts%
  4310.      IF Reg_GetProdSupportForShare(count%)=1 THEN
  4311.                 prod$ = Reg_GetProductAcronym(count%)
  4312.             IF network$ = gNODE$  THEN
  4313.                 If  prod$ <> "SUIT" THEN
  4314.                     prod$ = prod$ + gTOP$
  4315.                     If Lot_IsTheFeatureInstalled (prod$) = 1 Then
  4316.                     ShareSupport%=1
  4317.                     EXIT FOR
  4318.                     End If
  4319.                 End If
  4320.             ELSE
  4321.             ShareSupport%=1
  4322.             EXIT FOR
  4323.             END IF    
  4324.      END IF
  4325.       NEXT
  4326.    END IF
  4327.    Lot_AreShareToolsSupported=ShareSupport%
  4328. END FUNCTION
  4329.  
  4330. PUBLIC FUNCTION Lot_AreShare32ToolsSupported () AS INTEGER
  4331. '** Purpose:    Finds if any of the registered products supports share32
  4332. '** Author:     MZ
  4333. '** Arguments:  None
  4334. '** Returns:    1 if there is at least one product that supports share32
  4335. '**             0 if none of the registered prods supports share32 or if 
  4336. '**             no products are registered
  4337. '*************************************************************************
  4338.    DIM NumberOfProducts%,count%,Share32Support%
  4339.  
  4340.    Share32Support%=0
  4341.    ' Find how many products are registered
  4342.    NumberOfProducts%=Reg_GetNumberOfProducts()
  4343.    IF(NumberOfProducts%<>0) THEN
  4344.       ' Loop through the products
  4345.       FOR count%=1 TO NumberOfProducts%
  4346.      IF Reg_GetProdSupportForShare32(count%)=1 THEN
  4347.         Share32Support%=1
  4348.         EXIT FOR
  4349.      END IF
  4350.       NEXT
  4351.    END IF
  4352.    Lot_AreShare32ToolsSupported=Share32Support%
  4353. END FUNCTION
  4354.  
  4355. PUBLIC Lot_CallShareExec_RC%
  4356. PUBLIC FUNCTION Lot_CallSharedTool (func$) AS INTEGER
  4357. '** Purpose:    Simply calls a shared function through EXECUTE
  4358. '**             if share is loaded.  Using EXECUTE allows us to
  4359. '**             not load SHARE.LSS
  4360. '** Author:     MMETH
  4361. '** Arguments:  func$ the function to call.
  4362. '** Returns:    Whatever the function returns.
  4363. '**             
  4364. '*************************************************************************
  4365. DIM notused%
  4366.    Lot_CallSharedTool = 0
  4367.    IF Lot_AreShareToolsSupported () = 1 OR _
  4368.       Lot_AreShare32ToolsSupported () = 1 THEN
  4369.       'notused% = DOEXEC (("SHARE"), (prodcall$))
  4370.       gEndStatementEncountered% = FALSE
  4371.       EXECUTE(|USE "SHARE": sub initialize: Lot_CallShareExec_RC% =| & func$ & |:end sub|)
  4372.       'EXECUTE(|USE "SHARE" : Lot_CallShareExec_RC% = | & func$)
  4373.  
  4374.       '  this gEndStatementEncountered flag is necessary because the Lotus
  4375.       '  END statement, which normally exists the entire program, only
  4376.       '  exits the top-level routine running in DOEXEC.  So,
  4377.       '  check this flag here, to see if we hit an END during DOEXEC.
  4378.  
  4379.       IF gEndStatementEncountered% = TRUE THEN
  4380.      END                       ' exit the program
  4381.       END IF
  4382.  
  4383.       Lot_CallSharedTool = Lot_CallShareExec_RC%
  4384.    END IF
  4385.  
  4386. END FUNCTION
  4387.  
  4388.  
  4389. PUBLIC SUB SetRestartDir (szDir$) 
  4390. '** Purpose:
  4391. '** Author:
  4392. '** Arguments:
  4393. '** Returns:
  4394. '**     
  4395. '*************************************************************************
  4396.     ' This part doesn't really work any way.
  4397.     IF FSetRestartDir(szDir$) = FALSE THEN
  4398.     ErrorMsg SID_ERR_SETRESTARTDIR, ""
  4399.     ERROR STFQUIT
  4400.     END IF
  4401.  
  4402. END SUB
  4403.  
  4404. PUBLIC FUNCTION RestartListEmpty  AS INTEGER
  4405. '** Purpose:
  4406. '** Author:
  4407. '** Arguments:
  4408. '** Returns:
  4409. '**     
  4410. '*************************************************************************
  4411.  
  4412.     IF CInt(FRestartListEmpty()) = FALSE THEN
  4413.     RestartListEmpty = FALSE
  4414.     ELSE
  4415.     RestartListEmpty = TRUE
  4416.     END IF
  4417.  
  4418. END FUNCTION
  4419.  
  4420. PUBLIC FUNCTION ExitExecRestart  AS INTEGER
  4421. '** Purpose:
  4422. '** Author:
  4423. '** Arguments:
  4424. '** Returns:
  4425. '**     
  4426. '*************************************************************************
  4427.  
  4428.     ExitExecRestart = CInt(FExitExecRestart())
  4429.  
  4430. END FUNCTION
  4431.  
  4432.  
  4433. '** FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  4434. '**            
  4435. '** Purpose:   THis function will return the location of the destdir
  4436. '**            for the section, if the feature is installed.
  4437. '**            This function should **NOT** be used before PostCopyConfig.
  4438. '**            In a node situation it can be used during PreCopyConfig for
  4439. '**            shared components ** only! **
  4440. '**            This function can be used for standard, node, and server. Later
  4441. '**            will provide directory suuport on CDs also. Clients should use this function
  4442. '**            heavily! Make sure to check for empty string return "".
  4443. '**
  4444. '**            This function assumes: 
  4445. '**            1. The feature you are looking for exists in the INF file
  4446. '**                 if it doesn't, then we will always report back "" since
  4447. '**                 we depend upon the inf to find the destination directory
  4448. '**            2. The location of the feature relative to the top level
  4449. '**               product directory is identical for server and node!
  4450. '**            
  4451. '**            3. all files that can be found on the server using this
  4452. '**               functions must reside somewher under the main product directory
  4453. '**
  4454. '**            If clients use this function heavily, the transition to CD's
  4455. '**            and Toolkit supported node options will be smooth.
  4456. '**
  4457. '** Author:    MARCEL METH
  4458. '**
  4459. '** Arguments:    prodno%: The product that we are looking for.
  4460. '**            FeatureId$: which is the name of the keyword ID as it appears
  4461. '**                        in the INF FILE.
  4462. '**        filetolookfor$: a file in this section that we can use to
  4463. '**                        confirm that we found the feature.
  4464. '** Returns:   returns the directory where the feature can be found or ""
  4465. '**            If it can't be found.
  4466. '*************************************************************************
  4467. PUBLIC FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  4468.    DIM network$, dirsym$, chpt$, destdir$,s$,subdir$,installIniFile$
  4469.    
  4470.    network$ = GetSymbolValue(SYM_NETWORK$)
  4471.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4472.  
  4473.    '***Processing Suit
  4474.    '******************
  4475.    IF s$ = gSMARTSUITE$ THEN
  4476.  
  4477.       '***Processing Suit Standard
  4478.       IF network$ = gSTANDARD$ THEN
  4479.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4480.      '***Get the chapter
  4481.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4482.      IF chpt$ = "" GOTO NOFEATURE
  4483.      '***Get if the feature was installed
  4484. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4485. ' list
  4486. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4487. '     IF InorOut%=0 GOTO MAYBESUITCD
  4488.      '***Get the destination symbol
  4489.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4490.      IF dirsym$ = "" GOTO NOFEATURE
  4491.      '***Get the destination directory
  4492.      destdir$ = GetSymbolValue(dirsym$)
  4493.      IF destdir$ = "" GOTO NOFEATURE
  4494.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESUITCD
  4495.      '***Get the destination of the feature
  4496.      Lot_WhereIsFeature = destdir$
  4497.      EXIT FUNCTION
  4498.  
  4499.  
  4500.       '***Processing Suit Node
  4501.       ELSEIF network$ = gNODE$ THEN
  4502.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4503.      '***Get the chapter
  4504.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4505.      '***Look on the node
  4506.      IF chpt$ <> "" THEN
  4507.         '***Get if the feature was installed
  4508. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4509. ' list
  4510. '        InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4511. '        IF InorOut%=0 GOTO LOOKONSUITSRV
  4512.         '***Get the destination directory
  4513.         dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4514.         destdir$ = GetSymbolValue(dirsym$)
  4515.         IF DoesFileExist(destdir$+filetolookfor$,femExists) <> 0 THEN 
  4516.            '***Returns the destination of the feature
  4517.            Lot_WhereIsFeature = destdir$
  4518.            EXIT FUNCTION
  4519.         ELSE 
  4520.            GOTO LOOKONSUITSRV
  4521.         END IF
  4522.      ELSE 
  4523.         GOTO LOOKONSUITSRV
  4524.      END IF
  4525.  
  4526.  
  4527.       '***Processing Suit Server
  4528.       ELSEIF network$ = gSERVER$ THEN
  4529.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4530.      '***Get the chapter
  4531.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4532.      IF chpt$ = "" GOTO MAYBESUITCD
  4533.      '***Get if the feature was installed
  4534. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4535. ' list
  4536. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4537. '     IF InorOut%=0 GOTO MAYBESUITCD
  4538.      '***Get the destination symbol
  4539.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4540.      IF dirsym$ = "" GOTO MAYBESUITCD
  4541.      '***Get the destination directory
  4542.      destdir$ = GetSymbolValue(dirsym$)
  4543.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESUITCD
  4544.      '***Get the destination of the feature
  4545.      Lot_WhereIsFeature = destdir$
  4546.      EXIT FUNCTION
  4547.  
  4548.  
  4549.       '***Processing Suit Distribution
  4550.       ELSE  
  4551.      GOTO NOFEATURE
  4552.       END IF
  4553.  
  4554.    '***Processing Single product
  4555.    '****************************
  4556.    ELSEIF s$ = gSINGLE$ THEN
  4557.  
  4558.       '***Processing Single Product Standard
  4559.       IF network$ = gSTANDARD$ THEN
  4560.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4561.      '***Get the chapter
  4562.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4563.      IF chpt$ = "" GOTO NOFEATURE
  4564.      '***Get if the feature was installed
  4565. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4566. ' list
  4567. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4568. '     IF InorOut%=0 GOTO MAYBESINGLECD
  4569.      '***Get the destination symbol
  4570.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4571.      IF dirsym$ = "" GOTO NOFEATURE
  4572.      '***Get the destination directory
  4573.      destdir$ = GetSymbolValue(dirsym$)
  4574.      IF destdir$ = "" GOTO NOFEATURE
  4575.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESINGLECD
  4576.      '***Get the destination of the feature
  4577.      Lot_WhereIsFeature = destdir$
  4578.      EXIT FUNCTION
  4579.  
  4580.       '***Processing Single Product Node
  4581.       ELSEIF network$ = gNODE$ THEN
  4582.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4583.      '***Get the chapter
  4584.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4585.      '***Look on the node
  4586.      IF chpt$ <> "" THEN
  4587.         '***Get if the feature was installed
  4588. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4589. ' list
  4590. '        InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4591. '        IF InorOut%=0 GOTO LOOKONSINGLESRV
  4592.         '***Get the destination directory
  4593.         dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4594.         destdir$ = GetSymbolValue(dirsym$)
  4595.         IF DoesFileExist(destdir$+filetolookfor$,femExists) <> 0 THEN 
  4596.            '***Returns the destination of the feature
  4597.            Lot_WhereIsFeature = destdir$
  4598.            EXIT FUNCTION
  4599.         ELSE 
  4600.            GOTO LOOKONSINGLESRV
  4601.         END IF
  4602.      ELSE 
  4603.         GOTO LOOKONSINGLESRV
  4604.      END IF
  4605.  
  4606.        '***Processing Single Product Server
  4607.       ELSEIF network$ = gSERVER$ THEN
  4608.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4609.      '***Get the chapter
  4610.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4611.      IF chpt$ = "" GOTO MAYBESINGLECD
  4612.      '***Get if the feature was installed
  4613. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4614. ' list
  4615. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4616. '     IF InorOut%=0 GOTO MAYBESINGLECD
  4617.      '***Get the destination symbol
  4618.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4619.      IF dirsym$ = "" GOTO MAYBESINGLECD
  4620.      '***Get the destination directory
  4621.      destdir$ = GetSymbolValue(dirsym$)
  4622.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESINGLECD
  4623.      '***Get the destination of the feature
  4624.      Lot_WhereIsFeature = destdir$
  4625.      EXIT FUNCTION
  4626.  
  4627.       '***Processing Single Product Distribution
  4628.       ELSE  
  4629.      GOTO NOFEATURE
  4630.       END IF
  4631.    END IF
  4632.  
  4633.  
  4634.    Exit Function
  4635.    LOOKONSINGLESRV:
  4636.       destdir$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4637.       IF destdir$ = ""  THEN  destdir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4638.       IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO LOOKONNETCOMPONENT
  4639.       Lot_WhereIsFeature = destdir$
  4640.       EXIT FUNCTION
  4641.  
  4642.    LOOKONSUITSRV:
  4643.       destdir$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4644.       IF destdir$ = ""  THEN  destdir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4645.       installIniFile$ = MakePath(destdir$,gINSTALLINI$)
  4646.       subdir$ = GetIniKeyString(installIniFile$,"Destination Directories", Reg_GetProductAcronym(prodno%))
  4647.       IF DoesFileExist(destdir$+subdir$+filetolookfor$,femExists) = 0 GOTO LOOKONNETCOMPONENT
  4648.       Lot_WhereIsFeature = destdir$+subdir$
  4649.       EXIT FUNCTION
  4650.  
  4651.    LOOKONNETCOMPONENT:
  4652.       destdir$ = GetSymbolValue(SYM_NETCOMPONENT$)
  4653.       IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO NOFEATURE
  4654.       Lot_WhereIsFeature = destdir$
  4655.       EXIT FUNCTION
  4656.  
  4657.    MAYBESINGLECD:
  4658.       ''** MMETH WORK TO DO FOR CD; have a CDROOT symbol
  4659.    MAYBESUITCD:
  4660.       ''** MMETH WORK TO DO FOR CD; have a CDROOT symbol
  4661.  
  4662.    NOFEATURE:        
  4663.       Lot_WhereIsFeature = ""
  4664.  
  4665. END FUNCTION
  4666.  
  4667.  
  4668. PUBLIC FUNCTION Lot_IsTheFeatureInstalled(FeatureToFind$) AS INTEGER
  4669. '** Purpose:   Reads the chapters installed by the network  administrator 
  4670. '**            during server install into install.ini in the section
  4671. '**            [Server Feature Installed] and if the feature 
  4672. '**            was installed  returns 1 if not returns 0
  4673. '** Author:    MZ
  4674. '** Arguments: featureToFind$
  4675. '** Returns:   1 YES
  4676. '**            0 NO
  4677. '*************************************************************************
  4678.    DIM NetworkIns$ 
  4679.  
  4680.    'Identify if I am in node or server install
  4681.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4682.  
  4683.    PopulateCINSTALLLIST
  4684.  
  4685.    IF NetworkIns$ <> gDISTRIBUTION THEN
  4686.  
  4687.       If ISELEMENT(CINSTALL(FeatureToFind$)) <> FALSE Then
  4688.      Lot_IsTheFeatureInstalled = 1
  4689.       Else
  4690.      Lot_IsTheFeatureInstalled = 0
  4691.       End If
  4692.    Else
  4693.       Lot_IsTheFeatureInstalled = 0
  4694.    End If
  4695.  END FUNCTION
  4696.  
  4697. PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstallIni() AS INTEGER
  4698. '** Purpose:   Saves the Features installed by the network  administrator 
  4699. '**            during server install into install.ini in the section
  4700. '**            [Server Feature Installed];  This is needed at Node
  4701. '**            install time
  4702. '**            MMETH added: Also save during standard so that
  4703. '**                         we have a record for standard install
  4704. '**            MZ    Added: save [Destination Directories] needed by Node
  4705. '**                         suit install
  4706. '** Author:    MZ
  4707. '** Arguments: None
  4708. '** Returns:   SUCCESS
  4709. '*************************************************************************
  4710.    DIM NetworkIns$, prodDir$, gInstallIniFile$, CurrChpt$, FeatureName$
  4711.    DIM FeatureNum%,s$,AllProdNum%,prodNum%,ProdAcronym$,BaseDir$,symList$
  4712.    DIM prodsym$,progdir$
  4713.    DIM installkind$
  4714.  
  4715.    'Identify if I am in server or standard install
  4716.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4717.    IF NetworkIns$=gSERVER$ OR NetworkIns$=gSTANDARD THEN
  4718.  
  4719.       'Built the path to install.ini
  4720.       prodDir$ = Lot_GetInstallDir()
  4721.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4722.  
  4723.       PopulateCINSTALLLIST
  4724.  
  4725.       'Loop through the chapters and log the features
  4726.      CurrChpt$ = Lot_GetFirst("", F_INOROUT) 
  4727.      WHILE (CurrChpt$ <> "")
  4728.     'Log all installed chapters
  4729.     FeatureName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)
  4730.     If ISELEMENT(CINSTALL(FeatureName$)) = FALSE Then
  4731.        FeatureNum% = gNCINSTALL%    'Lot_GetLastFeatureNumber()
  4732.        CreateIniKeyValue gInstallIniFile$, "Server Feature Installed", "Feature"+LTRIM$(STR$(FeatureNum%+1)),FeatureName$, cmoOverwrite
  4733.        CINSTALL (FeatureName$) = "1"
  4734.        gNCINSTALL% = gNCINSTALL%+1
  4735.     END IF
  4736.     CurrChpt$ = Lot_GetNext() 
  4737.      WEND       
  4738.  
  4739.    END IF
  4740.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4741.  
  4742.    'Identify if I am in server and suit install
  4743.     IF NetworkIns$=gSERVER$ AND s$ = gSMARTSUITE$ THEN
  4744.       'Loop through the products and log the directories
  4745.         AllProdNum% = 0
  4746.         AllProdNum% = Reg_GetNumberOfProducts()
  4747.         IF AllProdNum% <> 0 THEN
  4748.             BaseDir$= GetSymbolValue(SYM_BASEDIR$)
  4749.             FOR prodNum%=1 TO AllProdNum%
  4750.                 ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4751.                 'Get the directory symbol
  4752.                 symList$ = Reg_GetDirSymbolList(prodNum%)
  4753.                 prodsym$ = GetListItem(symList$, 1)
  4754.                 progdir$ = GetListItem(prodsym$,1)
  4755.                 IF LEN(BaseDir$) < LEN(progdir$) THEN
  4756.                     CreateIniKeyValue gInstallIniFile$, "Destination Directories", ProdAcronym$,MID(progdir$,LEN(BaseDir$)+1), cmoOverwrite
  4757.                 END IF
  4758.             NEXT
  4759.       END IF
  4760.  
  4761.    END IF
  4762.  
  4763.    installkind$ = GetSymbolValue(SYM_INSTALLKIND$)
  4764.     'If we're a server, always write directories
  4765.     'Otherwise, write only if NOT a language install so that uninstall can work
  4766.     'correctly on the primary language
  4767.     IF NetworkIns$ = gSERVER$ OR installkind$ <> gLANGUAGEINSTALL$ THEN
  4768.    'write all destination symbols and their values
  4769.    Lot_WriteDestinationSymAndVal gInstallIniFile$, "Destination Symbols And Values" 
  4770.    Lot_WriteCriticalDirectories gInstallIniFile$
  4771.    IF GetSymbolValue(SYM_BASEDIR$) <>"" THEN
  4772.       CreateIniKeyValue gInstallIniFile$, _
  4773.             "Destination Symbols And Values", _
  4774.             "ParentDir",GetSymbolValue(SYM_BASEDIR$),_
  4775.             cmoOverwrite
  4776.    ELSE
  4777.       CreateIniKeyValue gInstallIniFile$, _
  4778.             "Destination Symbols And Values", _
  4779.             "ParentDir","", cmoOverwrite
  4780.    END IF
  4781.    END IF
  4782.  
  4783.    Lot_SaveFeaturesInstaledInInstallIni = SUCCESS
  4784. END FUNCTION
  4785.  
  4786. '*************************************************************************
  4787.  
  4788. PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstNodeIni() AS INTEGER
  4789. '** Purpose:   Saves the Features installed by the network  administrator 
  4790. '**            during server install into install.ini in the section
  4791. '**            [Server Feature Installed];  This is needed at Node
  4792. '**            install time
  4793. '**            MMETH added: Also save during standard so that
  4794. '**                         we have a record for standard install
  4795. '**            MZ    Added: save [Destination Directories] needed by Node
  4796. '**                         suit install
  4797. '** Author:    TV
  4798. '** Arguments: None
  4799. '** Returns:   SUCCESS
  4800. '*************************************************************************
  4801.    DIM NetworkIns$, prodDir$, gInstNodeIniFile$, CurrChpt$, FeatureName$
  4802.    DIM FeatureNum%,s$,AllProdNum%,prodNum%,ProdAcronym$,BaseDir$,symList$
  4803.    DIM prodsym$,progdir$, dirSym$, inidir$
  4804.  
  4805.    'Identify if I am in server or standard install
  4806.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4807.    IF NetworkIns$=gNODE THEN
  4808.       'Built the path to cinstnod.ini
  4809.     dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  4810.     IF GetListLength(dirSym$) >= 1 THEN
  4811.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  4812.         inidir$ = GetSymbolValue(dirSym$) 
  4813.               gInstNodeIniFile$ = MakePath(inidir$,"cinstnod.ini")
  4814.     END IF
  4815.  
  4816.  
  4817.       PopulateCINSTNODELIST
  4818.  
  4819.       'Loop through the chapters and log the features
  4820.      CurrChpt$ = Lot_GetFirst("", F_INOROUT) 
  4821.      WHILE (CurrChpt$ <> "")
  4822.     'Log all installed chapters
  4823.     FeatureName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)
  4824.     If ISELEMENT(CINSTNODE(FeatureName$)) = FALSE Then
  4825.        FeatureNum% = gNCINSTNODE%    'Lot_GetLastFeatureNumber()
  4826.        CreateIniKeyValue gInstNodeIniFile$, "Server Feature Installed", "Feature"+LTRIM$(STR$(FeatureNum%+1)),FeatureName$, cmoOverwrite
  4827.        CINSTNODE (FeatureName$) = "1"
  4828.        gNCINSTNODE% = gNCINSTNODE%+1
  4829.     END IF
  4830.     CurrChpt$ = Lot_GetNext() 
  4831.      WEND       
  4832.  
  4833.    END IF
  4834.    's$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4835.  
  4836.  
  4837.    'write all destination symbols and their values
  4838.    Lot_WriteDestinationSymAndVal gInstNodeIniFile$, "Destination Symbols And Values" 
  4839.    Lot_WriteCriticalDirectories gInstNodeIniFile$
  4840.    IF GetSymbolValue(SYM_BASEDIR$) <>"" THEN
  4841.       CreateIniKeyValue gInstNodeIniFile$, _
  4842.             "Destination Symbols And Values", _
  4843.             "ParentDir",GetSymbolValue(SYM_BASEDIR$),_
  4844.             cmoOverwrite
  4845.    ELSE
  4846.       CreateIniKeyValue gInstNodeIniFile$, _
  4847.             "Destination Symbols And Values", _
  4848.             "ParentDir","", cmoOverwrite
  4849.    END IF
  4850.  
  4851.    Lot_SaveFeaturesInstaledInInstNodeIni = SUCCESS
  4852. END FUNCTION
  4853.  
  4854. '*************************************************************************
  4855.  
  4856. FUNCTION Lot_GetLastFeatureNumber() AS INTEGER
  4857. '** Purpose:   Reads the features installed by the network  administrator 
  4858. '**            so far in the section [Server Feature Installed] and returns 
  4859. '**            the last number
  4860. '** Author:    MZ
  4861. '** Returns:   last number
  4862. '*************************************************************************
  4863.    DIM NetworkIns$, prodDir$, gInstallIniFile$, FeaturePref$
  4864.    DIM FeatureTag$, FeatureID$, rc%, lrc&
  4865.    STATIC FeatureNumber%
  4866.  
  4867.    'Identify if I am in node or server install
  4868.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4869.  
  4870.    IF NetworkIns$=gSERVER$ OR NetworkIns$=gSTANDARD$ THEN
  4871.  
  4872.       'Built the path to install.ini
  4873.       prodDir$ = Lot_GetInstallDir()
  4874.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4875.  
  4876.       FeaturePref$ = "Feature"
  4877.       FeatureNumber%=1
  4878.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  4879.       FeatureID$ = GetIniKeyString(gInstallIniFile$,"Server Feature Installed", FeatureTag$)
  4880. 'print gInstallIniFile$,"Server Feature Installed", FeatureTag$, FeatureID$, "XXX"
  4881.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4882.       IF lrc& = 1 THEN
  4883.      IF FeatureID$ = "" THEN
  4884.         Lot_GetLastFeatureNumber = 0
  4885.         EXIT FUNCTION
  4886.      ELSE   
  4887.         WHILE (FeatureID$ <> "")
  4888.            FeatureNumber% = FeatureNumber% + 1
  4889.            FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  4890.            FeatureID$ = GetIniKeyString(gInstallIniFile$,"Server Feature Installed", FeatureTag$)
  4891. 'print "in while","Server Feature Installed", FeatureTag$, FeatureID$, "XXX1"
  4892.         WEND
  4893.         Lot_GetLastFeatureNumber = FeatureNumber%-1
  4894. 'print"FeatureNum% in the loop for getLastFeatureNum",STR$(FeatureNumber%)
  4895.         EXIT FUNCTION
  4896.     END IF
  4897.      
  4898.      ELSE
  4899.     '** DND: Look into using ShowPathError here. We should tell the
  4900.     '**      user where we looked for install.ini
  4901.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  4902.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  4903.      END IF
  4904.    END IF
  4905.  END FUNCTION
  4906. '*************************************************************************
  4907.  
  4908. PUBLIC FUNCTION Lot_SaveTheNodeOptionsInInstallIni() AS INTEGER
  4909. '** Purpose:   Saves the node options installed by the network  administrator 
  4910. '**            during server install into install.ini in the section
  4911. '**            [<Product acronym> Node Options];  This is needed at Node
  4912. '**            install time
  4913. '** Author:    MZ
  4914. '** Arguments: None
  4915. '** Returns:   SUCCESS
  4916. '*************************************************************************
  4917.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$
  4918.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  4919.  
  4920.    'Identify if I am in server install
  4921.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4922.    IF NetworkIns$=gSERVER$ THEN
  4923.  
  4924.       'Built the path to install.ini
  4925.       prodDir$ = Lot_GetInstallDir()
  4926.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4927.  
  4928.       'Loop through the products and log the node options
  4929.       AllProdNum% = 0
  4930.       AllProdNum% = Reg_GetNumberOfProducts()
  4931.       IF AllProdNum% <> 0 THEN
  4932.      FOR prodNum%=1 TO AllProdNum%
  4933.         AllOptNum% = 0
  4934.         AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  4935.         IF AllOptNum% <> 0 THEN
  4936.            ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4937.            'Loop though options
  4938.            FOR OptNum%=1 TO AllOptNum% 
  4939.           IF Reg_IsNodeOptionSelected(prodNum%,OptNum%)=STR(1) THEN
  4940.              OptName$ = Reg_GetNodeOptionStr(prodNum%,OptNum%)
  4941.              IF OptName$ <> "" AND FIsKeywordinCopyList (OptName$) <> FALSE THEN
  4942.             OptCount% = Lot_GetLastNodeOptNumber(ProdAcronym$)
  4943.             CreateIniKeyValue gInstallIniFile$, ProdAcronym$+" Node Options", "Option"+LTRIM$(STR$(OptCount%+1)),OptName$, cmoOverwrite
  4944.              END IF
  4945.           END IF
  4946.            NEXT
  4947.         END IF
  4948.  
  4949.      NEXT
  4950.       END IF
  4951.    END IF
  4952.    Lot_SaveTheNodeOptionsInInstallIni = SUCCESS
  4953. END FUNCTION
  4954. '*************************************************************************
  4955.  
  4956. FUNCTION Lot_GetLastNodeOptNumber(ProdAcronym$) AS INTEGER
  4957. '** Purpose:   Reads the node options installed by the network  administrator 
  4958. '**            so far in the section [<ProdAcronym$>+" Node Options"] and returns 
  4959. '**            the last number
  4960. '** Author:    MZ
  4961. '** Returns:   last number
  4962. '*************************************************************************
  4963.    DIM NetworkIns$, prodDir$, gInstallIniFile$
  4964.    DIM OptTag$, OptID$, OptPref$, lrc&
  4965.    STATIC OptNumber%
  4966.  
  4967.    'Identify if I am in node or server install
  4968.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4969.  
  4970.    IF NetworkIns$=gSERVER$ THEN
  4971.  
  4972.       'Built the path to install.ini
  4973.       prodDir$ = Lot_GetInstallDir()
  4974.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4975.  
  4976.       OptPref$ = "Option"
  4977.       OptNumber%=1
  4978.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  4979.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  4980.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4981.       IF lrc& = 1 THEN
  4982.      IF OptID$ = "" THEN
  4983.         Lot_GetLastNodeOptNumber = 0
  4984.         EXIT FUNCTION
  4985.      ELSE   
  4986.         WHILE (OptID$ <> "")
  4987.            OptNumber% = OptNumber% + 1
  4988.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  4989.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  4990.         WEND
  4991.         Lot_GetLastNodeOptNumber = OptNumber%-1
  4992.         EXIT FUNCTION
  4993.     END IF
  4994.      
  4995.      ELSE
  4996.     '** DND: Look into using ShowPathError here. We should tell the
  4997.     '**      user where we looked for install.ini
  4998.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  4999.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5000.      END IF
  5001.    END IF
  5002.  END FUNCTION
  5003. '*************************************************************************
  5004.  
  5005. PUBLIC FUNCTION Lot_IsTheNodeOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  5006. '** Purpose:   Checks if the node options is available to node users
  5007. '**            by reading into install.ini in the section
  5008. '**            [<Product acronym> Node Options]; 
  5009. '** Author:    MZ
  5010. '** Arguments: None
  5011. '** Returns:   1 or 0 if it is or not available
  5012. '*************************************************************************
  5013.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$
  5014.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5015.  
  5016.    'Identify if I am in node install
  5017.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5018.    IF NetworkIns$=gNODE$ THEN
  5019.  
  5020.       'Built the path to install.ini
  5021.       prodDir$ = Lot_GetInstallDir()
  5022.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5023.       ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5024.       Lot_IsTheNodeOptionsAvailToNode = 0
  5025.  
  5026.       OptPref$ = "Option"
  5027.       OptNumber%=1
  5028.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5029.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5030.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5031.       IF lrc& = 1 THEN
  5032.      IF OptID$ = OptName$ THEN
  5033.         Lot_IsTheNodeOptionsAvailToNode = 1
  5034.         EXIT FUNCTION
  5035.      ELSE   
  5036.         WHILE (OptID$ <> "")
  5037.            IF OptID$ = OptName$ THEN
  5038.           Lot_IsTheNodeOptionsAvailToNode = 1
  5039.           EXIT FUNCTION
  5040.            END IF
  5041.            OptNumber% = OptNumber% + 1
  5042.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5043.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5044.         WEND
  5045.         Lot_IsTheNodeOptionsAvailToNode = 0
  5046.         EXIT FUNCTION
  5047.     END IF
  5048.      
  5049.      ELSE
  5050.     '** DND: Look into using ShowPathError here. We should tell the
  5051.     '**      user where we looked for install.ini
  5052.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5053.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5054.      END IF
  5055.    END IF
  5056.  END FUNCTION
  5057. '*************************************************************************
  5058.  
  5059. PUBLIC FUNCTION Lot_IsAnyNodeOptAvailToNode() AS INTEGER
  5060. '** Purpose:   Checks if any node options are available to node users
  5061. '**            by reading into install.ini in the section
  5062. '**            [<Product acronym> Node Options]; 
  5063. '** Author:    MZ
  5064. '** Arguments: None
  5065. '** Returns:   1 or 0 if it is or not available
  5066. '*************************************************************************
  5067.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5068.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&, prodNum%
  5069.  
  5070.    'Identify if I am in node install
  5071.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5072.    IF NetworkIns$=gNODE$ THEN
  5073.  
  5074.       'Built the path to install.ini
  5075.       prodDir$ = Lot_GetInstallDir()
  5076.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5077.  
  5078.       'Get all the products registered
  5079.       NumOfProds% = Reg_GetNumberOfProducts()
  5080.       IF NumOfProds% = 0 THEN
  5081.      Lot_IsAnyNodeOptAvailToNode = 0
  5082.      EXIT FUNCTION
  5083.       END IF
  5084.  
  5085.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5086.       IF lrc& = 1 THEN
  5087.      'Loop through the products
  5088.      FOR prodNum% = 1 TO NumOfProds%
  5089.         ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5090.  
  5091.         OptPref$ = "Option"
  5092.         OptNumber%=1
  5093.         OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5094.         OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5095.         IF OptID$ <> "" THEN
  5096.            Lot_IsAnyNodeOptAvailToNode = 1
  5097.            EXIT FUNCTION
  5098.        END IF
  5099.      NEXT 
  5100.      
  5101.       ELSE
  5102.      '** DND: Look into using ShowPathError here. We should tell the
  5103.      '**      user where we looked for install.ini
  5104.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5105.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5106.       END IF
  5107.  
  5108.    END IF
  5109.  END FUNCTION
  5110. '*************************************************************************
  5111.  
  5112. PUBLIC FUNCTION Lot_AreNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  5113. '** Purpose:   Checks if any node options are available to node users
  5114. '**            for the prodNum%, by reading into install.ini in the section
  5115. '**            [<Product acronym> Node Options]; 
  5116. '** Author:    MZ
  5117. '** Arguments: None
  5118. '** Returns:   1 or 0 if it is or not available
  5119. '*************************************************************************
  5120.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5121.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5122.  
  5123.    'Identify if I am in node install
  5124.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5125.    IF NetworkIns$=gNODE$ THEN
  5126.  
  5127.       'Built the path to install.ini
  5128.       prodDir$ = Lot_GetInstallDir()
  5129.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5130.  
  5131.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5132.       IF lrc& = 1 THEN
  5133.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5134.      OptPref$ = "Option"
  5135.      OptNumber%=1
  5136.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5137.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5138.      IF OptID$ <> "" THEN
  5139.         Lot_AreNodeOptAvailToNodeForProd = 1
  5140.         EXIT FUNCTION
  5141.      ELSE
  5142.         Lot_AreNodeOptAvailToNodeForProd = 0
  5143.         EXIT FUNCTION
  5144.      END IF
  5145.     
  5146.       ELSE
  5147.      '** DND: Look into using ShowPathError here. We should tell the
  5148.      '**      user where we looked for install.ini
  5149.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5150.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5151.       END IF
  5152.  
  5153.    END IF
  5154.  END FUNCTION
  5155. '*************************************************************************
  5156.  
  5157. PUBLIC FUNCTION Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  5158. '** Purpose:   Counts the node options available to node users
  5159. '**            for the prodNum%, by reading into install.ini in the section
  5160. '**            [<Product acronym> Node Options]; 
  5161. '** Author:    MZ
  5162. '** Arguments: None
  5163. '** Returns:   0 or num of options
  5164. '*************************************************************************
  5165.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfOptions%
  5166.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5167.  
  5168.    'Identify if I am in node install
  5169.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5170.    IF NetworkIns$=gNODE$ THEN
  5171.  
  5172.       'Built the path to install.ini
  5173.       prodDir$ = Lot_GetInstallDir()
  5174.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5175.  
  5176.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5177.       IF lrc& = 1 THEN
  5178.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5179.      OptPref$ = "Option"
  5180.      OptNumber%=1
  5181.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5182.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5183.      IF OptID$ <> "" THEN
  5184.         WHILE (OptID$ <> "")
  5185.            NumOfOptions% = OptNumber%
  5186.            OptNumber% = OptNumber% + 1
  5187.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5188.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5189.         WEND
  5190.       ELSE
  5191.         Lot_GetNumOfNodeOptAvailToNodeForProd = 0
  5192.         EXIT FUNCTION
  5193.      END IF
  5194.      Lot_GetNumOfNodeOptAvailToNodeForProd = NumOfOptions
  5195.      EXIT FUNCTION
  5196.     
  5197.       ELSE
  5198.      '** DND: Look into using ShowPathError here. We should tell the
  5199.      '**      user where we looked for install.ini
  5200.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5201.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5202.       END IF
  5203.  
  5204.    END IF
  5205.  END FUNCTION
  5206. '*************************************************************************
  5207.  
  5208. PUBLIC FUNCTION Lot_AreAnyNodeOptAvailToSrv() AS INTEGER
  5209. '** Purpose:   Checks the registration database to find the registred 
  5210. '**            node options
  5211. '** Author:    MZ
  5212. '** Arguments: None
  5213. '** Returns:   1 if there is at least 1 option or 0 if there is none
  5214. '*************************************************************************
  5215.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$, j%, nodeopt_flag%
  5216.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5217.    DIM OptKeyword$, chpt$
  5218.  
  5219.    'Identify if I am in server install
  5220.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5221.    IF NetworkIns$=gSERVER$ THEN
  5222.  
  5223.       'Built the path to install.ini
  5224.       prodDir$ = Lot_GetInstallDir()
  5225.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5226.  
  5227.       'Loop through the products and check for node options
  5228.       AllProdNum% = 0
  5229.       nodeopt_flag% = 0
  5230.       AllProdNum% = Reg_GetNumberOfProducts()
  5231.       IF AllProdNum% <> 0 THEN
  5232.      FOR prodNum%=1 TO AllProdNum%
  5233.         AllOptNum% = 0
  5234.         AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  5235.  
  5236. '            Reg_ReSetAllNodeOptsSelToDefaults prodNum%
  5237.         OptNum%=Reg_GetNumofNodeOptions(prodNum%)
  5238.      IF OptNum% <> 0 THEN
  5239.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%) + gTOP$)
  5240.        ' Loop through the options
  5241.         FOR j% = 1 TO OptNum%
  5242.         OptKeyWord$ = Reg_GetNodeOptionStr(prodNum%,j%)
  5243.         chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  5244.         IF INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1 THEN
  5245.          nodeopt_flag% = 1
  5246.         END IF
  5247.         NEXT
  5248.      END IF
  5249.      
  5250.      IF AllOptNum% <> 0 AND nodeopt_flag% <> 0 THEN
  5251.            Lot_AreAnyNodeOptAvailToSrv=1
  5252.            EXIT FUNCTION
  5253.         END IF
  5254.      NEXT
  5255.       ELSE
  5256.      Lot_AreAnyNodeOptAvailToSrv=0
  5257.      EXIT FUNCTION
  5258.       END IF
  5259.    ELSE
  5260.       Lot_AreAnyNodeOptAvailToSrv=0
  5261.       EXIT FUNCTION
  5262.    END IF
  5263.  
  5264.    Lot_AreAnyNodeOptAvailToSrv=0
  5265. END FUNCTION
  5266. '*************************************************************************
  5267.  
  5268.  
  5269.  
  5270. PUBLIC FUNCTION Lot_SaveTheCDOptionsInInstallIni() AS INTEGER
  5271. '** Purpose:   Saves the CD options installed by the network  administrator 
  5272. '**            during server install into install.ini in the section
  5273. '**            [<Product acronym> CD Options];  This is needed at CD
  5274. '**            install time
  5275. '** Author:    MZ
  5276. '** Arguments: None
  5277. '** Returns:   SUCCESS
  5278. '*************************************************************************
  5279.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$
  5280.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5281.  
  5282.    'Identify if I am in server install
  5283.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5284.    IF NetworkIns$=gSERVER$ THEN
  5285.  
  5286.       'Built the path to install.ini
  5287.       prodDir$ = Lot_GetInstallDir()
  5288.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5289.  
  5290.       'Loop through the products and log the CD options
  5291.       AllProdNum% = 0
  5292.       AllProdNum% = Reg_GetNumberOfProducts()
  5293.       IF AllProdNum% <> 0 THEN
  5294.      FOR prodNum%=1 TO AllProdNum%
  5295.         AllOptNum% = 0
  5296.         AllOptNum% = Reg_GetNumofCDOptions(prodNum%)
  5297.         IF AllOptNum% <> 0 THEN
  5298.            ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5299.            'Loop though options
  5300.            FOR OptNum%=1 TO AllOptNum% 
  5301.           IF Reg_IsCDOptionSelected(prodNum%,OptNum%)=STR(1) THEN
  5302.              OptName$ = Reg_GetCDOptionStr(prodNum%,OptNum%)
  5303.              IF OptName$ <> "" AND FIsKeywordinCopyList (OptName$) <> FALSE THEN
  5304.             OptCount% = Lot_GetLastCDOptNumber(ProdAcronym$)
  5305.             CreateIniKeyValue gInstallIniFile$, ProdAcronym$+" CD Options", "Option"+LTRIM$(STR$(OptCount%+1)),OptName$, cmoOverwrite
  5306.              END IF
  5307.           END IF
  5308.            NEXT
  5309.         END IF
  5310.  
  5311.      NEXT
  5312.       END IF
  5313.    END IF
  5314.    Lot_SaveTheCDOptionsInInstallIni = SUCCESS
  5315. END FUNCTION
  5316. '*************************************************************************
  5317.  
  5318. FUNCTION Lot_GetLastCDOptNumber(ProdAcronym$) AS INTEGER
  5319. '** Purpose:   Reads the CD options installed by the network  administrator 
  5320. '**            so far in the section [<ProdAcronym$>+" CD Options"] and returns 
  5321. '**            the last number
  5322. '** Author:    MZ
  5323. '** Returns:   last number
  5324. '*************************************************************************
  5325.    DIM NetworkIns$, prodDir$, gInstallIniFile$
  5326.    DIM OptTag$, OptID$, OptPref$, rc%
  5327.    STATIC OptNumber%
  5328.  
  5329.    'Identify if I am in CD or server install
  5330.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5331.  
  5332.    IF NetworkIns$=gSERVER$ THEN
  5333.  
  5334.       'Built the path to install.ini
  5335.       prodDir$ = Lot_GetInstallDir()
  5336.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5337.  
  5338.       OptPref$ = "Option"
  5339.       OptNumber%=1
  5340.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5341.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5342.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5343.      IF OptID$ = "" THEN
  5344.         Lot_GetLastCDOptNumber = 0
  5345.         EXIT FUNCTION
  5346.      ELSE   
  5347.         WHILE (OptID$ <> "")
  5348.            OptNumber% = OptNumber% + 1
  5349.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5350.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5351.         WEND
  5352.         Lot_GetLastCDOptNumber = OptNumber%-1
  5353.         EXIT FUNCTION
  5354.     END IF
  5355.      
  5356.      ELSE
  5357.     '** DND: Look into using ShowPathError here. We should tell the
  5358.     '**      user where we looked for install.ini
  5359.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5360.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5361.      END IF
  5362.    END IF
  5363.  END FUNCTION
  5364. '*************************************************************************
  5365.  
  5366. PUBLIC FUNCTION Lot_IsTheCDOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  5367. '** Purpose:   Checks if the CD options is available to node users
  5368. '**            by reading into install.ini in the section
  5369. '**            [<Product acronym> CD Options]; 
  5370. '** Author:    MZ
  5371. '** Arguments: None
  5372. '** Returns:   1 or 0 if it is or not available
  5373. '*************************************************************************
  5374.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$
  5375.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5376.  
  5377.    'Identify if I am in node install
  5378.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5379.    IF NetworkIns$=gNODE$ THEN
  5380.  
  5381.       'Built the path to install.ini
  5382.       prodDir$ = Lot_GetInstallDir()
  5383.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5384.       ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5385.       Lot_IsTheCDOptionsAvailToNode = 0
  5386.  
  5387.       OptPref$ = "Option"
  5388.       OptNumber%=1
  5389.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5390.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5391.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5392.      IF OptID$ = OptName$ THEN
  5393.         Lot_IsTheCDOptionsAvailToNode = 1
  5394.         EXIT FUNCTION
  5395.      ELSE   
  5396.         WHILE (OptID$ <> "")
  5397.            IF OptID$ = OptName$ THEN
  5398.           Lot_IsTheCDOptionsAvailToNode = 1
  5399.           EXIT FUNCTION
  5400.            END IF
  5401.            OptNumber% = OptNumber% + 1
  5402.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5403.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5404.         WEND
  5405.         Lot_IsTheCDOptionsAvailToNode = 0
  5406.         EXIT FUNCTION
  5407.     END IF
  5408.      
  5409.      ELSE
  5410.     '** DND: Look into using ShowPathError here. We should tell the
  5411.     '**      user where we looked for install.ini
  5412.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5413.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5414.      END IF
  5415.    END IF
  5416.  END FUNCTION
  5417. '*************************************************************************
  5418.  
  5419. PUBLIC FUNCTION Lot_IsAnyCDOptAvailToNode() AS INTEGER
  5420. '** Purpose:   Checks if any CD options are available to node users
  5421. '**            by reading into install.ini in the section
  5422. '**            [<Product acronym> CD Options]; 
  5423. '** Author:    MZ
  5424. '** Arguments: None
  5425. '** Returns:   1 or 0 if it is or not available
  5426. '*************************************************************************
  5427.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5428.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%,prodNum%
  5429.  
  5430.    'Identify if I am in node install
  5431.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5432.    IF NetworkIns$=gNODE$ THEN
  5433.  
  5434.       'Built the path to install.ini
  5435.       prodDir$ = Lot_GetInstallDir()
  5436.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5437.  
  5438.       'Get all the products registered
  5439.       NumOfProds% = Reg_GetNumberOfProducts()
  5440.       IF NumOfProds% = 0 THEN
  5441.      Lot_IsAnyCDOptAvailToNode = 0
  5442.      EXIT FUNCTION
  5443.       END IF
  5444.  
  5445.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5446.      'Loop through the products
  5447.      FOR prodNum% = 1 TO NumOfProds%
  5448.         ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5449.  
  5450.         OptPref$ = "Option"
  5451.         OptNumber%=1
  5452.         OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5453.         OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5454.         IF OptID$ <> "" THEN
  5455.            Lot_IsAnyCDOptAvailToNode = 1
  5456.            EXIT FUNCTION
  5457.        END IF
  5458.      NEXT 
  5459.      
  5460.       ELSE
  5461.      '** DND: Look into using ShowPathError here. We should tell the
  5462.      '**      user where we looked for install.ini
  5463.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5464.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5465.       END IF
  5466.  
  5467.    END IF
  5468.  END FUNCTION
  5469. '*************************************************************************
  5470.  
  5471. PUBLIC FUNCTION Lot_AreCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  5472. '** Purpose:   Checks if any CD options are available to node users
  5473. '**            for the prodNum%, by reading into install.ini in the section
  5474. '**            [<Product acronym> CD Options]; 
  5475. '** Author:    MZ
  5476. '** Arguments: None
  5477. '** Returns:   1 or 0 if it is or not available
  5478. '*************************************************************************
  5479.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5480.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5481.  
  5482.    'Identify if I am in node install
  5483.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5484.    IF NetworkIns$=gNODE$ THEN
  5485.  
  5486.       'Built the path to install.ini
  5487.       prodDir$ = Lot_GetInstallDir()
  5488.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5489.  
  5490.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5491.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5492.      OptPref$ = "Option"
  5493.      OptNumber%=1
  5494.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5495.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5496.      IF OptID$ <> "" THEN
  5497.         Lot_AreCDOptAvailToNodeForProd = 1
  5498.         EXIT FUNCTION
  5499.      ELSE
  5500.         Lot_AreCDOptAvailToNodeForProd = 0
  5501.         EXIT FUNCTION
  5502.      END IF
  5503.     
  5504.       ELSE
  5505.      '** DND: Look into using ShowPathError here. We should tell the
  5506.      '**      user where we looked for install.ini
  5507.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5508.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5509.       END IF
  5510.  
  5511.    END IF
  5512.  END FUNCTION
  5513. '*************************************************************************
  5514.  
  5515. PUBLIC FUNCTION Lot_GetNumOfCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  5516. '** Purpose:   Counts the CD options available to node users
  5517. '**            for the prodNum%, by reading into install.ini in the section
  5518. '**            [<Product acronym> CD Options]; 
  5519. '** Author:    MZ
  5520. '** Arguments: None
  5521. '** Returns:   0 or num of options
  5522. '*************************************************************************
  5523.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfOptions%
  5524.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5525.  
  5526.    'Identify if I am in node install
  5527.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5528.    IF NetworkIns$=gNODE$ THEN
  5529.  
  5530.       'Built the path to install.ini
  5531.       prodDir$ = Lot_GetInstallDir()
  5532.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5533.  
  5534.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5535.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5536.      OptPref$ = "Option"
  5537.      OptNumber%=1
  5538.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5539.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5540.      IF OptID$ <> "" THEN
  5541.         WHILE (OptID$ <> "")
  5542.            NumOfOptions% = OptNumber%
  5543.            OptNumber% = OptNumber% + 1
  5544.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5545.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5546.         WEND
  5547.       ELSE
  5548.         Lot_GetNumOfCDOptAvailToNodeForProd = 0
  5549.         EXIT FUNCTION
  5550.      END IF
  5551.      Lot_GetNumOfCDOptAvailToNodeForProd = NumOfOptions
  5552.      EXIT FUNCTION
  5553.     
  5554.       ELSE
  5555.      '** DND: Look into using ShowPathError here. We should tell the
  5556.      '**      user where we looked for install.ini
  5557.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5558.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5559.       END IF
  5560.  
  5561.    END IF
  5562.  END FUNCTION
  5563. '*************************************************************************
  5564.  
  5565. PUBLIC FUNCTION Lot_AreAnyCDOptAvailToSrv() AS INTEGER
  5566. '** Purpose:   Checks the registration database to find the registred 
  5567. '**            CD options
  5568. '** Author:    MZ
  5569. '** Arguments: None
  5570. '** Returns:   1 if there is at least 1 option or 0 if there is none
  5571. '*************************************************************************
  5572.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$, j%, CDopt_flag%
  5573.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5574.    DIM OptKeyword$, chpt$
  5575.  
  5576.    'Identify if I am in server install
  5577.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5578.    IF NetworkIns$=gSERVER$ THEN
  5579.  
  5580.       'Built the path to install.ini
  5581.       prodDir$ = Lot_GetInstallDir()
  5582.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5583.  
  5584.       'Loop through the products and check for CD options
  5585.       AllProdNum% = 0
  5586.       CDopt_flag% = 0
  5587.       AllProdNum% = Reg_GetNumberOfProducts()
  5588.       IF AllProdNum% <> 0 THEN
  5589.      FOR prodNum%=1 TO AllProdNum%
  5590.         AllOptNum% = 0
  5591.         AllOptNum% = Reg_GetNumofCDOptions(prodNum%)
  5592.  
  5593. '            Reg_ReSetAllCDOptsSelToDefaults prodNum%
  5594.         OptNum%=Reg_GetNumofCDOptions(prodNum%)
  5595.      IF OptNum% <> 0 THEN
  5596.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%) + gTOP$)
  5597.        ' Loop through the options
  5598.         FOR j% = 1 TO OptNum%
  5599.         OptKeyWord$ = Reg_GetCDOptionStr(prodNum%,j%)
  5600.         chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  5601.         IF INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1 THEN
  5602.          CDopt_flag% = 1
  5603.         END IF
  5604.         NEXT
  5605.      END IF
  5606.      
  5607.      IF AllOptNum% <> 0 AND CDopt_flag% <> 0 THEN
  5608.            Lot_AreAnyCDOptAvailToSrv=1
  5609.            EXIT FUNCTION
  5610.         END IF
  5611.      NEXT
  5612.       ELSE
  5613.      Lot_AreAnyCDOptAvailToSrv=0
  5614.      EXIT FUNCTION
  5615.       END IF
  5616.    ELSE
  5617.       Lot_AreAnyCDOptAvailToSrv=0
  5618.       EXIT FUNCTION
  5619.    END IF
  5620.  
  5621.    Lot_AreAnyCDOptAvailToSrv=0
  5622. END FUNCTION
  5623. '*************************************************************************
  5624.  
  5625.  
  5626.  
  5627.  
  5628. '*************************************************************************
  5629. '** FUNCTION GetNotesPathfromLotusIni() AS STRING
  5630. '**
  5631. '** Purpose: Gets the notes dir path from Lotus.ini file, and searches for
  5632. '**          notes.exe in the product dir path. 
  5633. '**            
  5634. '** Author:    INSIK RHEE
  5635. '** Arguments: None
  5636. '** Returns:   if notes.exe does not exist in dir specified in lotus.ini, it
  5637. '**            returns "", otherwise returns the full path without filename.
  5638. '*************************************************************************
  5639.  
  5640.  
  5641. PUBLIC FUNCTION GetNotesPathfromLotusIni() AS STRING
  5642. DIM DestDir$, lotusinipath$, defdir$, temp%, ProdDir$, fullpath$, rv%
  5643.  
  5644.    DestDir$ = GetWindowsDir()
  5645.    lotusinipath$ = DestDir$ +"lotus.ini"
  5646.  
  5647.    if DoesFileExist(lotusinipath$,femExists) then
  5648.       defdir$ = GetIniKeyString(lotusinipath$,"Lotus Applications", "Notes")
  5649.       if defdir$ <> "" then
  5650.      temp% = INSTR(1,LCASE$(defdir$),"notes.exe")
  5651.      if temp% <> 0 then
  5652.         ProdDir$ = MID$(defdir$,1,(temp%-1))
  5653.         if ProdDir$ <> "" then
  5654.            fullpath$ = ProdDir$ + "notes.exe"
  5655.            if DoesFileExist(fullpath$, femExists) then
  5656.           GetNotesPathfromLotusIni = MID$(defdir$,1,(temp%-2))
  5657.           EXIT FUNCTION
  5658.            end if 
  5659.         end if 
  5660.      end if 
  5661.       end if 
  5662.    end if
  5663.  
  5664.    GetNotesPathfromLotusIni = ""
  5665.  
  5666. END FUNCTION
  5667.  
  5668. '*************************************************************************
  5669. '** FUNCTION IsNotesInPath AS INTEGER
  5670. '**
  5671. '** Purpose: Detects the presence of notes path in the autoexec.bat file
  5672. '**            
  5673. '** Author:    INSIK RHEE
  5674. '** Arguments: None
  5675. '** Returns:   1 if true, 0 if false.
  5676. '*************************************************************************
  5677.  
  5678. PUBLIC FUNCTION IsNotesInPath() AS INTEGER
  5679. DIM     notesdir$,autoexec$,Buffer$
  5680. DIM autofile%, FoundPath%
  5681.  
  5682.     notesdir$ = GetNotesPathfromLotusIni()
  5683.     IsNotesInPath = 0                                                                       ' default = FALSE
  5684.     if notesdir$ = "" then
  5685.         IsNotesInPath = 1
  5686.         EXIT FUNCTION
  5687.     end if
  5688.     autoexec$ = GetBootDrive() 
  5689.    IF autoexec$ <> "" THEN
  5690.       autoexec$ = autoexec$ + "autoexec.bat" 
  5691.    ELSE
  5692.       autoexec$ = "c:\" + "autoexec.bat"
  5693.    END IF
  5694.  
  5695.    autofile% = 111
  5696.     OPEN autoexec$ FOR INPUT AS autofile%
  5697.     Do Until EOF(autofile%)
  5698.         LINE INPUT #autofile%, Buffer$
  5699.         FoundPath% = INSTR(1,LCASE$(Buffer$), "path")
  5700.         if FoundPath% <> 0 Then                                                 ' path statement found.
  5701.             FoundPath% = INSTR(FoundPath%, LCASE$(Buffer$), LCASE$(notesdir$))
  5702.             if FoundPath% <> 0 Then 
  5703.                 IsNotesInPath = 1
  5704.                 CLOSE #autofile%
  5705.                 EXIT FUNCTION
  5706.             end if
  5707.         end if
  5708.     Loop
  5709.     CLOSE #autofile%
  5710.  
  5711. END FUNCTION
  5712.  
  5713. '*************************************************************************
  5714. '** FUNCTION IsShareInAUTOEXEC AS INTEGER
  5715. '**
  5716. '** Purpose: Detects the presence of SHARE.EXE in the autoexec.bat file
  5717. '**            
  5718. '** Author:    INSIK RHEE
  5719. '** Arguments: None
  5720. '** Returns:   1 if true, 0 if false.
  5721. '*************************************************************************
  5722.  
  5723. PUBLIC FUNCTION IsShareInAUTOEXEC() AS INTEGER
  5724. DIM   autoexec$,Buffer$
  5725. DIM   autofile%, FoundShare%
  5726.  
  5727.     IsShareInAUTOEXEC = 0                                                                   ' default = FALSE
  5728.    autoexec$ = GetBootDrive() 
  5729.    IF autoexec$ <> "" THEN
  5730.       autoexec$ = autoexec$ + "autoexec.bat" 
  5731.    ELSE
  5732.       autoexec$ = "c:\" + "autoexec.bat"
  5733.    END IF
  5734.  
  5735.     autofile% = 111
  5736.     OPEN autoexec$ FOR INPUT AS autofile%
  5737.     Do Until EOF(autofile%)
  5738.         LINE INPUT #autofile%, Buffer$
  5739.         FoundShare% = INSTR(1,LCASE$(Buffer$), "share")
  5740.         if FoundShare% <> 0 Then                                                        ' share statement found.
  5741.             IsShareInAUTOEXEC = 1
  5742.             CLOSE #autofile%
  5743.             EXIT FUNCTION
  5744.         end if
  5745.     Loop
  5746.    CLOSE #autofile%
  5747.  
  5748. END FUNCTION
  5749.  
  5750. '*************************************************************************
  5751. '** FUNCTION ModifyAutoexec AS STRING
  5752. '**
  5753. '** Purpose: Modifies autoexec.bat to include share and/or modify path to 
  5754. '**             include notes 
  5755. '**            
  5756. '** Author:    INSIK RHEE
  5757. '** Arguments:  modflag%        = bitwise flag on what to modify.
  5758. '**                             directmod%      = 1 to modify autoexec.bat (backing up old one)
  5759. '**                                                       0 to modify to a backup file 
  5760. '**                             backup$         = backup filename 
  5761. '** Returns:   NULL string if success.  string describing error otherwise
  5762. '**     NOTE: This function assumes that the caller has already used the 
  5763. '** IsNotesInPath and IsShareEnabled calls and will NOT check to see if 
  5764. '** the modifications are redundant.
  5765. '*************************************************************************
  5766.  
  5767.  
  5768. PUBLIC FUNCTION ModifyAutoexec(modflag%,directmod%,backup$) AS STRING
  5769. DIM     notesdir$,src$,dest$,Buffer$
  5770. DIM srcfile%,destfile%, FoundPath%, PathNext%
  5771.  
  5772.     srcfile% = 112
  5773.     destfile% = 113
  5774.     ModifyAutoexec=""                                                               ' default
  5775.     if (modflag% AND MANotes) then                          ' notes mod
  5776.         notesdir$ = GetNotesPathfromLotusIni()
  5777.     end if
  5778.    src$ = GetBootDrive() 
  5779.    IF src$ <> "" THEN
  5780.       dest$ = src$ + backup$
  5781.       src$ = src$ + "autoexec.bat"
  5782.     ELSE
  5783.       dest$ = "c:\" + backup$
  5784.       src$ = "c:\" + "autoexec.bat"
  5785.    END IF
  5786.  
  5787.     
  5788.     IF Win32CopyFile(src$, dest$, TRUE) = FALSE THEN
  5789.         ModifyAutoexec = LdString( SID_ERR_AUTOEXEC_NOT_COPIED )
  5790.         EXIT FUNCTION
  5791.     End If
  5792.  
  5793.     Win32CopyFile src$, dest$, TRUE
  5794.  
  5795.     if directmod% <> 0 then
  5796.         src$ = dest$
  5797.       dest$ = GetBootDrive()
  5798.       IF dest$ <> "" THEN
  5799.      dest$ = dest$ + "autoexec.bat" 
  5800.       ELSE
  5801.            dest$ = "c:\" + "autoexec.bat"
  5802.       END IF
  5803.    
  5804.     End If
  5805.     OPEN src$ FOR INPUT AS srcfile%
  5806.     OPEN dest$ FOR OUTPUT AS destfile%
  5807.     PathNext% = 0   ' set to 1 when path found, 2 after mod is done.
  5808.     Do Until EOF(srcfile%)
  5809.         LINE INPUT #srcfile%, Buffer$
  5810.         FoundPath% = INSTR(1,LCASE$(Buffer$), "path")
  5811.         if ((FoundPath% <> 0) AND (PathNext <> 2)) Then  ' path statement found.
  5812.             PathNext% = 1
  5813.         end if
  5814.         PRINT #destfile%, Buffer$
  5815.         if PathNext% = 1 Then
  5816.             if (modflag% AND MANotes) then
  5817.                 PRINT #destfile%, "PATH=%PATH%;"+notesdir$
  5818.             End If
  5819.             If (modflag% AND MAShare) then
  5820.                 PRINT #destfile%, "SHARE"
  5821.             End If
  5822.             PathNext% = 2
  5823.         End If
  5824.     Loop
  5825.     if PathNext% <> 2 Then                                                                  ' path statement not found?
  5826.         if (modflag% AND MANotes) then
  5827.             PRINT #destfile%, "PATH=%PATH%;"+notesdir$
  5828.         End If
  5829.         If (modflag% AND MAShare) then
  5830.             PRINT #destfile%, "SHARE"
  5831.         End If
  5832.     End If
  5833.     CLOSE #srcfile%, #destfile%
  5834. END FUNCTION
  5835.  
  5836. '*************************************************************************
  5837. '** FUNCTION GetBootDrive() AS STRING
  5838. '**
  5839. '** Purpose: Gets the boot drive letter and trailing slash (e.g. "C:\")
  5840. '**            
  5841. '** Author:    INSIK RHEE
  5842. '** Arguments: None
  5843. '** Returns:   Searches the fixed drive list for AUTOEXEC.BAT
  5844. '**                        returns null string if none found. (or READ_ONLY drive)
  5845. '*************************************************************************
  5846.  
  5847. PUBLIC FUNCTION GetBootDrive() AS STRING
  5848. DIM lDrive$, Length%, count%
  5849.     GetLocalHardDrivesList SYM_LOCALHARDDRIVES$
  5850.     Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  5851.     FOR count% = 1 TO Length%
  5852.         lDrive$     = GetListItem(SYM_LOCALHARDDRIVES$, count%) + ":\"
  5853.         IF IsDirWritable(lDrive$) AND (DoesFileExist(lDrive$+"autoexec.bat",femExists)=1) THEN
  5854.         GetBootDrive$ = lDrive$
  5855.             EXIT FUNCTION
  5856.         END IF
  5857.     NEXT
  5858.     GetBootDrive$=""
  5859. END FUNCTION
  5860.  
  5861.  
  5862. PUBLIC SUB      DL_SetOraclePath
  5863. '** Purpose:   This subroutine Sets the Oracle Data Path symbol
  5864. '**            
  5865. '** Author:    JMD
  5866. '** Arguments: NONE
  5867. '*************************************************************************
  5868.     DIM TmpDDir$
  5869.     ' Should use this if NODE or STANDARD - 
  5870.     TmpDDir$ = Lot_GetORACLEHomePath() 
  5871.     IF TmpDDir$ <> "" THEN
  5872.        SetSymbolValue SYM_ORACLEHOMEDIR$, TmpDDir$
  5873.          Lot_RefreshDestination(SYM_ORACLEHOMEDIR$)
  5874.     End If
  5875. END SUB
  5876.  
  5877. PUBLIC SUB      DL_SetNotesDataPath
  5878. '** Purpose:   This subroutine Sets the DataLens specific symbols for the
  5879. '**            Notes Data Path.  This facilitates copying NSF files to the 
  5880. '**            proper DOC location
  5881. '** Author:    PJT
  5882. '** Arguments: NONE
  5883. '*************************************************************************
  5884.     DIM TmpDDir$
  5885.     ' Should use this if NODE or STANDARD - 
  5886.     TmpDDir$ = Lot_GetLotusNotesDataPath() 
  5887.     'print "Got Lotus Notes Data Directory of " & TmpDDir$
  5888.     IF TmpDDir$ <> "" THEN
  5889.        SetSymbolValue SYM_LOTUSNOTESDATADIR$, TmpDDir$
  5890.          Lot_RefreshDestination(SYM_LOTUSNOTESDATADIR$)
  5891.     End If
  5892. END SUB
  5893.  
  5894. PUBLIC FUNCTION Lot_GetLotusNotesDataPath() AS STRING
  5895. '** Purpose:         Returns the location for the Notes Data Directory
  5896. '** Author:          PTilton
  5897. '** Arguments:       None.
  5898. '** Returns:             NULL String if Notes Data Directory not found.
  5899. '**                  Otherwise, returns directory of Notes Data Directory.
  5900. '*************************************************************************
  5901.    DIM szDir$, szSearch$, szTmp$, rc%, lrc&
  5902.  
  5903.    Lot_GetLotusNotesDataPath = ""
  5904.    szTmp$ = GetIniKeyString( "Notes.ini", "Notes", "Directory")
  5905.    If szTmp$ <> "" Then
  5906.        lrc& = FDirExists ( szTmp$ )
  5907. '          print "Does Directory -" & szTmp$ & "- Exist: " & str( rc% )
  5908.        If (lrc& = 1) Then
  5909.           Lot_GetLotusNotesDataPath = szTmp$
  5910.        End If
  5911.    Else
  5912.       szTmp$ = GetIniKeyString( "Lotus.ini", "Lotus Applications", "Notes")
  5913.       szSearch$ = ucase$( szTmp$ )
  5914.       rc% = instr( szSearch$, "NOTES.EXE") 
  5915.       If rc% > 2 Then
  5916.           szDir$ = left$(szTmp$, rc% - 2 )
  5917. '                 print "Notes LOTUS.INI Data Directory: " & szDir$
  5918.           lrc& = FDirExists ( szDir$ )
  5919. '                 print "Does LOTUS.INI Directory Exist: " & str( lrc& )
  5920.           If (lrc& = 1) Then
  5921.              szTmp$ = GetIniKeyString( szDir$ & "\" & "Notes.ini", "Notes", "Directory")
  5922. '                        print "Notes Data Directory: " & szTmp$
  5923.              If szTmp$ <> "" Then
  5924.                 lrc& = FDirExists ( szTmp$ )
  5925. '                               print "Does Directory -" & szTmp$ & "- Exist: " & str( lrc& )
  5926.                 If (lrc& = 1) Then
  5927.                    Lot_GetLotusNotesDataPath = szTmp$
  5928.                 End If
  5929.          Else
  5930.             Lot_GetLotusNotesDataPath = szDir$
  5931.          End If
  5932.           End If
  5933.       End If
  5934.    End If
  5935. END FUNCTION
  5936. '*************************************************************************
  5937.  
  5938. PUBLIC FUNCTION Lot_GetLotusNotesPrgPath() AS STRING
  5939. '** Purpose:         Returns the location for the Notes Data Directory
  5940. '** Author:          PTilton
  5941. '** Arguments:       None.
  5942. '** Returns:             NULL String if Notes Data Directory not found.
  5943. '**                  Otherwise, returns directory of Notes Data Directory.
  5944. '*************************************************************************
  5945.    DIM szDir$, szSearch$, szTmp$, rc%, lrc&
  5946.    DIM szPath$, szFile$, szSect$, szKey$, szExe$
  5947.  
  5948.    szPath$ = GetSymbolValue( SYM_WINDIR$ ) & LdString( SID_DATALENS_NOTES_INI )
  5949.    szSect$ = LdString( SID_DATALENS_NOTES_SECT )
  5950.    szKey$ = LdString( SID_DATALENS_NOTES_KEY )
  5951.    szExe$ = LdString( SID_DATALENS_NOTES_EXE )
  5952.  
  5953.    Lot_GetLotusNotesPrgPath = ""
  5954.    szTmp$ = GetIniKeyString( szPath$, szSect$, szKey$ )
  5955.    szSearch$ = ucase$( szTmp$ )
  5956.    rc% = instr( szSearch$, szExe$) 
  5957.    If rc% > 2 Then
  5958.       szDir$ = left$(szTmp$, rc% - 2 )
  5959.       'print "Notes LOTUS.INI Program Directory: " & szDir$
  5960.       lrc& = FDirExists ( szDir$ )
  5961.       'print "Does LOTUS.INI Program Directory Exist: " & str( rc% )
  5962.       If (lrc& = 1) Then
  5963.      Lot_GetLotusNotesPrgPath = szDir$
  5964.       End If
  5965.    End If
  5966. END FUNCTION
  5967. '*************************************************************************
  5968.  
  5969. 'FUNCTION GetLotusNotesDataPath(szFile$, szSect$, szKey$) AS STRING
  5970. '** Purpose:         Returns the location for the Notes Data Directory
  5971. '** Author:          PTilton
  5972. '** Arguments:       None.
  5973. '** Returns:             NULL String if Notes Data Directory not found.
  5974. '**                  Otherwise, returns directory of Notes Data Directory.
  5975. '*************************************************************************
  5976. '   DIM szDir$, rc%
  5977.  
  5978. '   GetLotusNotesDataPath = ""
  5979.    
  5980. '   rc% = DoesIniSectionExist (szFile$, szSect$) 
  5981. '   print "Does Section [" & szSect$ & "] Exist in File("& szFile$ &": " & str( rc% )
  5982. '   If (rc% = 1) Then
  5983. '      rc% = DoesIniKeyExist (szFile$, szSect$, szKey$)
  5984. '      print "Does Key -" & szKey$ & "- Exist: " & str( rc% )
  5985. '      If (rc% = 1) Then
  5986. '         szDir$ = GetIniKeyString (szFile$, szSect$, szKey$)
  5987. '         print "Keyword -" & szKey$ & "- Value: " & szDir$
  5988. '         GetLotusNotesDataPath =szDir$
  5989. '      End If
  5990. '   End If
  5991. 'END FUNCTION
  5992. '*************************************************************************
  5993.  
  5994.  
  5995. PUBLIC FUNCTION Lot_GetORACLEHomePath() AS STRING
  5996. '** Purpose:         Returns the location for the ORACLE Home Directory
  5997. '** Author:          PTilton
  5998. '** Arguments:       None.
  5999. '** Returns:             NULL String if ORACLE Home Directory not found.
  6000. '**                  Otherwise, returns directory of ORACLE Home Directory.
  6001. '*************************************************************************
  6002.    DIM szPath$, szTmp$, rc%, lrc&, szFile$, szSect$, szKey$
  6003.  
  6004.    szPath$ = GetSymbolValue( SYM_WINDIR$ ) & LdString( SID_DATALENS_ORACLE_INI )
  6005.    szSect$ = LdString( SID_DATALENS_ORACLE_SECT )
  6006.    szKey$ = LdString( SID_DATALENS_ORACLE_KEY )
  6007.    Lot_GetORACLEHomePath = ""
  6008.    szTmp$ = GetIniKeyString ( szPath$, szSect$, szKey$ )
  6009.    'print "Oracle Home Directory: " & szTmp$
  6010.    If szTmp$ <> "" Then
  6011.        lrc& = FDirExists ( szTmp$ )
  6012.        'print "Does Directory -" & szTmp$ & "- Exist: " & str( lrc& )
  6013.        If (lrc& = 1) Then
  6014.           Lot_GetORACLEHomePath = szTmp$
  6015.        End If
  6016.    End If
  6017. END FUNCTION
  6018. '*************************************************************************
  6019.  
  6020. PUBLIC FUNCTION Lot_IsDestVerNewerOrEqual(DestinationPath$,sourcever1&,sourcever2&,sourcever3&,sourcever4&) AS INTEGER
  6021. '** Purpose:   This function validates the version of the file
  6022. '** Author:    MZ
  6023. '** Arguments: DestinationPath$,
  6024. '**            SourceVer1&,
  6025. '**            SourceVer2&,
  6026. '**            SourceVer3&,
  6027. '**            SourceVer4&
  6028. '** Returns:   1 if newer or equal
  6029. '**            0 if older or the file is not found or it does not have version
  6030. '*************************************************************************
  6031.    DIM DestFileVersion$
  6032.    DIM DestVer1&,DestVer2&,DestVer3&,DestVer4&, notused%
  6033.  
  6034.    'Find If the file exists
  6035.    IF DoesFileExist(DestinationPath$,femExists)=1 THEN
  6036.  
  6037.       'Find the version
  6038.       DestFileVersion$=GetVersionOfFile(DestinationPath$)
  6039.  
  6040.       'If no version found
  6041.       IF DestFileVersion$="" THEN
  6042.      Lot_IsDestVerNewerOrEqual = 0
  6043.      EXIT FUNCTION
  6044.  
  6045.       'If version found
  6046.       ELSE
  6047.      'Find the version components
  6048.      DestVer1&=GetVersionNthField(DestFileVersion$,1)
  6049.      DestVer2&=GetVersionNthField(DestFileVersion$,2)
  6050.      DestVer3&=GetVersionNthField(DestFileVersion$,3)
  6051.      DestVer4&=GetVersionNthField(DestFileVersion$,4)
  6052.  
  6053.      'Compare the version
  6054.      IF SourceVer1& > DestVer1& THEN
  6055.         Lot_IsDestVerNewerOrEqual = 0
  6056.         EXIT FUNCTION
  6057.      ELSEIF SourceVer1& = DestVer1& AND _
  6058.         SourceVer2& > DestVer2& THEN
  6059.         Lot_IsDestVerNewerOrEqual = 0
  6060.         EXIT FUNCTION
  6061.      ELSEIF SourceVer1& = DestVer1& AND _
  6062.         SourceVer2& = DestVer2& AND _
  6063.         SourceVer3& > DestVer3& THEN
  6064.         Lot_IsDestVerNewerOrEqual = 0
  6065.         EXIT FUNCTION
  6066.      ELSEIF SourceVer1& = DestVer1& AND _
  6067.         SourceVer2& = DestVer2& AND _
  6068.         SourceVer3& = DestVer3& AND _
  6069.         SourceVer4& > DestVer4& THEN
  6070.         Lot_IsDestVerNewerOrEqual = 0
  6071.         EXIT FUNCTION
  6072.      ELSEIF SourceVer1& = DestVer1& AND _
  6073.         SourceVer2& = DestVer2& AND _
  6074.         SourceVer3& = DestVer3& AND _
  6075.         SourceVer4& = DestVer4& THEN
  6076.         'Version is equal. Delete the source
  6077.         Lot_IsDestVerNewerOrEqual = 1
  6078.         EXIT FUNCTION
  6079.      ELSE
  6080.         'Dest is newer.
  6081.         Lot_IsDestVerNewerOrEqual = 1
  6082.         EXIT FUNCTION
  6083.      END IF
  6084.  
  6085.       END IF
  6086.    'file not found in the destination
  6087.    ELSE
  6088.       Lot_IsDestVerNewerOrEqual = 0
  6089.       EXIT FUNCTION
  6090.    END IF
  6091. END FUNCTION
  6092.  
  6093. CONST ObjectPrefix$="Object"
  6094. CONST gMISCINSTALLEDOBJECTS="Miscellaneous Installed Objects"
  6095.  
  6096. SUB PopulateCOBJECTLIST(iniPath$)
  6097. '*************************************************************************
  6098. '** Purpose:         Compiles a list of objects already in the cinstall or
  6099. '**                  cinstnod.ini file; populates list COBJECT
  6100. '** Author:          JMD
  6101. '** Arguments:       Full pathname of .INI file
  6102. '** Returns:             NULL String if Notes Data Directory not found.
  6103. '**                  Otherwise, returns directory of Notes Data Directory.
  6104. '*************************************************************************
  6105.    DIM Number%
  6106.    DIM Tag$, ID$, rc%
  6107.    STATIC gCOBJECTinited%  ''ASSUME gCOBJECTinited% starts as zero
  6108.  
  6109.    If  gCOBJECTinited% <> 1 THEN
  6110.         gNCOBJECT% = 0
  6111.       gCOBJECTinited% = 1
  6112.         IF DoesFileExist(iniPath$,femExists) = 1 THEN
  6113.             Erase COBJECT 
  6114.             Number%=1
  6115.             Tag$=ObjectPrefix$+LTRIM$(STR$(Number%))
  6116.             ID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, Tag$)
  6117.             WHILE ID$ <> ""
  6118.                 gNCOBJECT% = Number%
  6119.                 COBJECT (ID$) = gNCOBJECT%
  6120.                 Number% = Number% + 1
  6121.                 Tag$=ObjectPrefix$+LTRIM$(STR$(Number%))
  6122.                 ID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, Tag$)
  6123.             WEND
  6124.         ELSE
  6125.      '** DND: Look into using ShowPathError here. We should tell the
  6126.      '**      user where we looked for install.ini
  6127.             FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6128.         END IF
  6129.     END IF
  6130.  
  6131. END SUB
  6132.  
  6133. SUB PopulateCINSTALLLIST
  6134.    DIM prodDir$, installIniFile$, FeaturePref$, Featurenumber%
  6135.    DIM FeatureTag$, FeatureID$, rc%
  6136.    STATIC gCINSTALLinited%  ''ASSUME gCINSTALLinited% starts as zero
  6137.  
  6138.    If  gCINSTALLinited% <> 1 Then
  6139.       gNCINSTALL% = 0
  6140.       gCINSTALLinited% = 1
  6141.  
  6142.       'Built the path to install.ini
  6143.       prodDir$ = Lot_GetInstallDir()
  6144.       installIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  6145.  
  6146.       FeaturePref$ = "Feature"
  6147.       FeatureNumber%=1
  6148.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6149.       FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6150.       IF DoesFileExist(installIniFile$,femExists) = 1 THEN
  6151.     IF FeatureID$ <> "" THEN
  6152.        DO
  6153.           CINSTALL (FeatureID$) = "1"
  6154.           gNCINSTALL% = gNCINSTALL%+1
  6155.           FeatureNumber% = FeatureNumber% + 1
  6156.           FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6157.           FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6158.        LOOP UNTIL FeatureID$ = ""
  6159.         END IF
  6160.       ELSE
  6161.      '** DND: Look into using ShowPathError here. We should tell the
  6162.      '**      user where we looked for install.ini
  6163.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6164.       END IF
  6165.    END IF
  6166. END SUB
  6167.  
  6168. '*************************************************************************
  6169. SUB PopulateCINSTNODELIST
  6170.    DIM prodDir$, installIniFile$, FeaturePref$, Featurenumber%
  6171.    DIM FeatureTag$, FeatureID$, rc%, dirSym$, inidir$
  6172.    STATIC gCINSTNODEinited%  ''ASSUME gCINSTALLinited% starts as zero
  6173.  
  6174.    If  gCINSTNODEinited% <> 1 Then
  6175.       gNCINSTNODE% = 0
  6176.       gCINSTNODEinited% = 1
  6177.  
  6178.       'Built the path to cinstnod.ini
  6179.       dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  6180.       IF GetListLength(dirSym$) >= 1 THEN
  6181.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  6182.         inidir$ = GetSymbolValue(dirSym$) 
  6183.               installIniFile$ = MakePath(inidir$,"cinstnod.ini")
  6184.       END IF
  6185.  
  6186.       FeaturePref$ = "Feature"
  6187.       FeatureNumber%=1
  6188.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6189.       FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6190.       IF DoesFileExist(installIniFile$,femExists) = 1 THEN
  6191.     IF FeatureID$ <> "" THEN
  6192.        DO
  6193.           CINSTNODE (FeatureID$) = "1"
  6194.           gNCINSTNODE% = gNCINSTNODE%+1
  6195.           FeatureNumber% = FeatureNumber% + 1
  6196.           FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6197.           FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6198.        LOOP UNTIL FeatureID$ = ""
  6199.         END IF
  6200.       ELSE
  6201.      '** DND: Look into using ShowPathError here. We should tell the
  6202.      '**      user where we looked for install.ini
  6203.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6204.       END IF
  6205.    END IF
  6206. END SUB
  6207.  
  6208. '*************************************************************************
  6209. '** PUBLIC FUNCTION TrimNetlotusapp (path$) AS STRING
  6210. '**
  6211. '** Purpose:   trims the net lotusapp directory to detect mapping. 
  6212. '** Author:    Thangv
  6213. '** Arguments: path$ 
  6214. '** Returns:   the modified path
  6215. '*************************************************************************
  6216.  
  6217. PUBLIC FUNCTION TrimNetlotusapp (ByVal path$) AS STRING
  6218.  
  6219.    DIM  firstslash%, newpath$, drive$
  6220.    
  6221.    TrimNetlotusapp = ""
  6222.    path$ = Lot_TrimEndSlash (path$)
  6223.    drive$ = LEFT(path$, 2)
  6224.    
  6225.    firstslash% = INSTR(1,path$,"\")
  6226.    WHILE firstslash% <> 0
  6227.       path$ = MID$(path$,firstslash%+1)
  6228.       newpath$ = drive$ + "\" + path$
  6229.       IF DoesDirExist(newpath$) = 1 THEN
  6230.      TrimNetlotusapp = newpath$ + "\"
  6231.      EXIT FUNCTION     
  6232.       ELSE 
  6233.      firstslash% = INSTR(1,path$,"\")                       
  6234.       END IF
  6235.    WEND
  6236.  
  6237. END FUNCTION
  6238.  
  6239. PUBLIC FUNCTION Lot_RegisterUninstaller(ProdRegKeyName$,ProdVer$,_
  6240.                     ProdDisplayedName$,ProdInfPath$,_
  6241.                     LogFlag%,AutoFlag%,_
  6242.                     LangID$,LogFile$,RspFile$,_
  6243.                     UserName$ ) AS INTEGER
  6244. '** Purpose:   Registers the uninstaller for a product and builds the uninstall
  6245. '**            command line. This function should be called in PostCopyConfig()
  6246. '** Author:    MZ
  6247. '** Arguments: ProdRegKeyName$     The name of the product key in the registry
  6248. '**            ProdVer$            The version of the product installed
  6249. '**            ProdDisplayedName$  The description of the product put into the registry
  6250. '**            ProdInfPath$        The path of the standalone/server INF file
  6251. '**            LogFlag%            TRUE/FALSE if you want uninstall to produce or not a log
  6252. '**            AutoFlag%           TRUE/FALSE if you want uninstall to run or not silantelly
  6253. '**            LangID$             The default language for uninstall
  6254. '**            LogFile$ (optional) The log file path to overwrite the default provided by uninstall
  6255. '**            RspFile$ (optional) The response file path to overwrite the default provided by uninstall
  6256. '**            UserName$(optional) The User Name
  6257. '** Returns:   True if worked False otherwise
  6258. '*************************************************************************
  6259. DIM gInstallIniFile$,cwd$,prodDir$,Network$,ProdNameAndVer$,CommandLine$ 
  6260. DIM Platform%, PlatformStr$, LReturn&, grouptitle$, Caption$, dirSym$, RegKey$
  6261. DIM s$, szkey$, IsRootProduct%
  6262.  
  6263.    'Validate the arguments
  6264.    IF ProdRegKeyName$ = "" OR _
  6265.       ProdVer$ = "" OR _
  6266.       ProdDisplayedName$ = "" OR _
  6267.       ProdInfPath$ = "" OR _
  6268.       LangID$ = "" THEN
  6269.       Lot_RegisterUninstaller = FALSE
  6270.    END IF
  6271.  
  6272.    IF LogFlag% <> FALSE AND LogFlag% <> TRUE THEN
  6273.       Lot_RegisterUninstaller = FALSE
  6274.    END IF
  6275.  
  6276.    IF AutoFlag% <> FALSE AND AutoFlag% <> TRUE THEN
  6277.       Lot_RegisterUninstaller = FALSE
  6278.    END IF
  6279.    
  6280.    Network$ = GetSymbolValue(SYM_NETWORK$)
  6281.  
  6282.  'TV: For server, distribution installs don't register uninstall
  6283.     IF Network$ = gSERVER$ OR Network$ = gDISTRIBUTION$ THEN EXIT FUNCTION
  6284.  
  6285.     ' The first product, either suite or this product for standalone
  6286.     ProdNameAndVer$ = MakePath(GetSymbolValue(SYM_REG_PRODUCTNAME$) , GetSymbolValue(SYM_REG_PRODUCTVER$))
  6287.     s$ = MakePath(ProdRegKeyName$, ProdVer$)
  6288.     IsRootProduct% = (ProdNameAndVer$ =  s$)
  6289. 'Only register suite uninstaller, or single product
  6290. IF IsRootProduct% THEN
  6291.     
  6292.    'Built the path to cinstall.ini
  6293.    IF Network$ = gNODE$ THEN
  6294.       'Get the target directory for the product
  6295.       dirSym$ = Reg_GetDirSymbolList(Lot_GetCurrentProduct())
  6296.       If GetListLength(dirSym$) >= 1 Then
  6297.          dirSym$ = GetListItem(dirSym$, 1)
  6298.          gInstallIniFile$ = GetSymbolValue(dirSym$)+"Cinstnod.ini"
  6299.       End If
  6300.    ELSEIF Network$=gSERVER$ OR Network$=gSTANDARD THEN
  6301.       'Get the install directory
  6302.       prodDir$ = Lot_GetInstallDir()
  6303.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  6304.    END IF
  6305.  
  6306.    'print gInstallIniFile$,"gInstallIniFile$"
  6307.    PlatformStr$ = gREGWINNAME
  6308.  
  6309.    'Write the uninstall key and registry values
  6310.     RegKey$=PlatformStr$+"\Uninstall\"+ProdRegKeyName$+" V"+ProdVer$
  6311.    LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, RegKey$)
  6312.   'print " after calling Lot_RegCreateKeyEx in share32",LReturn&
  6313.   IF LReturn& <> ERROR_SUCCESS THEN
  6314.      Lot_RegisterUninstaller = FALSE
  6315.       RegErrorMsg SID_ERR_REG_CREATE, gHLM$+"\"+RegKey$,"",""
  6316.   END IF
  6317.         
  6318.   'Write the display name key and value
  6319.   'print " before calling Lot_CreateRegKeyValueEx in share32"        
  6320.   LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, RegKey$,_
  6321.               "DisplayName",_
  6322.               REG_SZ,_
  6323.               ProdDisplayedName$, _
  6324.               LENBP(ProdDisplayedName$)+1)
  6325.   'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&
  6326.   IF LReturn& <> ERROR_SUCCESS THEN
  6327.       Lot_RegisterUninstaller = FALSE
  6328.        RegErrorMsg SID_ERR_REG_UNINST, gHLM$+RegKey$,"DisplayName",ProdDisplayedName$
  6329.   END IF
  6330.  
  6331.   'Build the command line
  6332.   CommandLine$ = | /T | & ProdRegKeyName & | /V | & ProdVer$
  6333.   IF IsNewShell() THEN
  6334.         CommandLine$ = CommandLine$ & | /I "| & ProdInfPath$ & |"|
  6335.         CommandLine$ = CommandLine$ & | /C "| & gInstallIniFile$ & |"|   
  6336.     ELSE
  6337. 'JMD:
  6338. '    NT 3.51 has a bug that truncates the command line in the program icon if
  6339. '    there are embedded quotes; therefore embedded quotes are NOT supported for
  6340. '    NT 3.51 (old Win 3.1 shell) only
  6341.         CommandLine$ = CommandLine$ & " /I " & ProdInfPath$
  6342.         CommandLine$ = CommandLine$ & " /C " & gInstallIniFile$
  6343.     END IF
  6344.   IF LogFlag% <> FALSE THEN
  6345.      CommandLine$ = CommandLine$+" /O "
  6346.   END IF
  6347.   IF LogFile$ <> "" THEN
  6348.      CommandLine$ = CommandLine$+LogFile$
  6349.   END IF
  6350.   IF AutoFlag% <> FALSE THEN
  6351.      CommandLine$ = CommandLine$+" /A "
  6352.   END IF
  6353.   IF RspFile$ <> "" THEN
  6354.      CommandLine$ = CommandLine$+RspFile$
  6355.   END IF
  6356.   CommandLine$ = CommandLine$+" /L "+LangID$
  6357.   IF UserName$ <> "" THEN
  6358.      CommandLine$ = CommandLine$+" /U "+UserName$
  6359.   END IF    
  6360.   CommandLine$ = GetWindowsDir()+gUNINSTALLEXE+CommandLine$
  6361.  
  6362.     ' Register it under the first product (suit or main product for single)
  6363.     s$ = Reg_GetProductAcronym(1) + gTOP$
  6364.   IF NOT IsNewShell() THEN
  6365.         Caption$ = ProdRegKeyName$+" V"+ProdVer$+" "+gUNINSTALL
  6366.       grouptitle$ = Reg_GetProgManagerGroupName(1)
  6367.     CreateProgmanItem grouptitle$, Caption$, CommandLine$, GetWindowsDir()+gUNINSTALLEXE, cmoOverwrite
  6368.     Lot_RegisterObject s$, UNIN_CLASS_ICON$, grouptitle$ + "\" + Caption$
  6369.   END IF
  6370.  
  6371.   'print CommandLine$,"CommandLine$"
  6372.   'Write the CommandLine
  6373.   'print " before calling Lot_CreateRegKeyValueEx in share32"        
  6374.   LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, RegKey$,_
  6375.               "UninstallString",_
  6376.               REG_SZ,_
  6377.               CommandLine$, _
  6378.               LENBP(CommandLine$)+1)
  6379.   'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&        
  6380.  
  6381.   IF LReturn& <> ERROR_SUCCESS THEN
  6382.       Lot_RegisterUninstaller = FALSE
  6383.        RegErrorMsg SID_ERR_REG_UNINST, gHLM$+RegKey$,"UninstallString",CommandLine$
  6384.   ELSE
  6385.       Lot_RegisterUninstaller = TRUE
  6386.   END IF
  6387.  
  6388. END IF    ' IF IsRootProduct% 
  6389.  
  6390.     ' Register suite products for Suite uninstall
  6391.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6392.     szkey$ = gREGLOTUS + ProdNameAndVer$ + "\Products\"
  6393.     szkey$ = szkey$  + ProdRegKeyName$ + "\" +  ProdVer$
  6394.     IF s$ = gSMARTSUITE$ THEN
  6395.         IF NOT IsRootProduct% THEN
  6396.             IF Lot_DoesRegKeyExistEx(HKEY_LOCAL_MACHINE, szKey$) = FALSE THEN
  6397.                 IF Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKey$) <> 0 THEN
  6398.                     Lot_RegisterUninstaller = FALSE
  6399.                     EXIT FUNCTION
  6400.                 END IF
  6401.             END IF
  6402.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, szKey$,_
  6403.               "InfFileName", REG_SZ, ProdInfPath$, LENBP(ProdInfPath$)+1)
  6404.         END IF
  6405.     ELSE
  6406.         ' Delete these entries so single prodcut uninstall can work
  6407.         IF Lot_DoesRegKeyExistEx(HKEY_LOCAL_MACHINE, szKey$) = TRUE THEN _
  6408.             LReturn& = Lot_RegDelAllSubKeys(HKEY_LOCAL_MACHINE, szKey)
  6409.     END IF
  6410.     Lot_RegisterUninstaller = (LReturn& = ERROR_SUCCESS)
  6411.  
  6412. END FUNCTION
  6413.  
  6414. PUBLIC FUNCTION Lot_RegisterObject(FeatureKeyWord$, ClassOfObject$, ObjectPath$)
  6415. '** Purpose:   Registers the [Miscellaneous Installed Objects] into cinstall.ini 
  6416. '**            for standalone installs and into cinsnode.ini for node installs
  6417. '** Author:    MZ
  6418. '** Arguments: FeatureKeyWord$     The KeyWord of the section that is associate 
  6419. '**                                with this object
  6420. '**            ClassOfObject$      The classes; The predefined (in globals.lss)
  6421. '**                                classes are: 
  6422. '**                                UNIN_CLASS_PROGRAM_GROUP$
  6423. '**                                UNIN_CLASS_ICON$
  6424. '**                                UNIN_CLASS_FOLDER$
  6425. '**                                UNIN_CLASS_SHORTCUT$
  6426. '**                                UNIN_CLASS_START_MENU_ENTRY$
  6427. '**                                UNIN_CLASS_REGISTRY_KEY$
  6428. '**                                UNIN_CLASS_REGISTRY_VALUE$
  6429. '**                                UNIN_CLASS_REGISTRY_HIVE$
  6430. '**                                UNIN_CLASS_FILE$
  6431. '**                                UNIN_CLASS_FILE_GROUP$
  6432. '**                                UNIN_CLASS_DIRECTORY$
  6433. '** Returns:   True if worked False otherwise
  6434. '*************************************************************************
  6435. DIM gInstallIniFile$,inidir$, s$,Network$
  6436. DIM NodeInstIniFile$,ObjectNum%,lrc&, ObjectPref$
  6437. DIM ObjectTag$, ObjectID$, LastObjectNumber%, dirSym$, temp%
  6438. DIM ObjectName$
  6439. STATIC iniPath$
  6440. STATIC ThisInstallType$
  6441.  
  6442.    'Get the install type
  6443.    Network$ = GetSymbolValue(SYM_NETWORK$)
  6444.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6445.  
  6446.     IF NOT IsNewShell() AND ClassOfObject$ = UNIN_CLASS_ICON$ THEN
  6447.         temp% = INSTR(ObjectPath$, "\")
  6448.         IF LEN(ObjectPath$) > temp%+40 THEN
  6449.             ObjectPath$ = LEFT$(ObjectPath$, temp%+40)
  6450.         END IF
  6451.     END IF
  6452.  
  6453.     'TV: For server and distribution installs don't register any objects
  6454.     IF Network$ = gSERVER$ OR Network$ = gDISTRIBUTION$ THEN EXIT FUNCTION 
  6455.     
  6456.     '** Initialization:
  6457.     IF ThisInstallType$ <> Network$ THEN
  6458.         ThisInstallType$ = Network$
  6459.         '** Built the path to cinstall.ini (in standalone case) 
  6460.         '** or cinstnod.ini (in NODE case)
  6461.         IF Network$ = gNODE$ AND s$ = gSMARTSUITE$ THEN
  6462.             inidir$ = GetSymbolValue(SYM_BASEDIR$)
  6463.             NodeInstIniFile$ = inidir$+"cinstnod.ini"
  6464.             iniPath$ = NodeInstIniFile$
  6465.         ELSEIF Network$ = gNODE$ AND s$ = gSINGLE$ THEN
  6466.             dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  6467.             IF GetListLength(dirSym$) >= 1 THEN
  6468.                 dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  6469.                 inidir$ = GetSymbolValue(dirSym$) 
  6470.             ELSE
  6471.                 inidir$ = GetSymbolValue(SYM_STF_CWDDIR$)
  6472.             END IF
  6473.             NodeInstIniFile$ = inidir$+"cinstnod.ini"
  6474.             iniPath$ = NodeInstIniFile$
  6475.         ELSEIF Network$=gSTANDARD THEN
  6476.             'Get the install directory
  6477.             inidir$ = Lot_GetInstallDir()
  6478.             gInstallIniFile$ = MakePath(inidir$,gINSTALLINI$)
  6479.             iniPath$ = gInstallIniFile$
  6480.         END IF
  6481.         'print iniPath$,"IniPath$"
  6482.         '** Construct a list of objects already there
  6483.         PopulateCOBJECTLIST(iniPath$)
  6484.     END IF
  6485.  
  6486.     '** See if the object's already there, if not, write a new object
  6487.     '** and add to List
  6488.  
  6489.     ObjectName$ = FeatureKeyWord$+","+ClassOfObject$+","+ObjectPath$
  6490.     ObjectName$ = NullTrim (ObjectName$)
  6491.    If ISELEMENT(COBJECT(ObjectName$)) = FALSE THEN 
  6492.         gNCOBJECT% = gNCOBJECT% + 1
  6493.         CreateIniKeyValue iniPath$, gMISCINSTALLEDOBJECTS,_
  6494.                     "Object"+LTRIM$(STR$(gNCOBJECT%)), _
  6495.                     ObjectName$,  cmoOverwrite
  6496.                 COBJECT (ObjectName$) = gNCOBJECT%
  6497.     END IF
  6498.  
  6499. END FUNCTION
  6500.  
  6501. '*************************************************************************
  6502. PUBLIC FUNCTION Lot_GetDestDirValueFromInstallini(DestDirSym$) AS STRING
  6503. '**
  6504. '** Purpose:   trims the net lotusapp directory to detect mapping. 
  6505. '** Author:    Thangv, PD, JMD
  6506. '** Arguments: path$ 
  6507. '** Returns:   the modified path
  6508. '*************************************************************************
  6509. DIM DestDirSymVal$, rv%, source$
  6510. DIM gInstallIniFile$,inidir$
  6511. DIM uncvol$, dirPath$
  6512. DIM iniPath$    
  6513.  
  6514.     Lot_GetDestDirValueFromInstallini = ""
  6515.     'Get the install directory
  6516.     'Save initial value since it may change over course of install
  6517.     inidir$ = Lot_GetInstallDir()
  6518.     gInstallIniFile$ = MakePath(inidir$,gINSTALLINI$)
  6519.     iniPath$ = gInstallIniFile$
  6520.     DestDirSymVal$ = GetIniKeyString(iniPath$,_
  6521.                  "Destination Symbols And Values", _
  6522.                  DestDirSym$)
  6523.     IF  DestDirSymVal$ <> "" THEN
  6524.         rv% = DoesDirExist(DestDirSymVal$)
  6525.         IF rv% = 0 THEN
  6526.                 '** TV: shouldn't get here even if destdirSymVal is UNC
  6527.         source$ =  GetSymbolValue(SYM_STF_SRCDIR$)
  6528.                 IF NOT Lot_IsUnvalidatedUNCPath(source$) THEN
  6529.                 DestDirSymVal$ = MID$(source$,1,1)+MID$(DestDirSymVal$,2)
  6530.                 ELSE
  6531.                         Lot_SplitUNCPath source$, uncvol$, dirPath$
  6532.                 DestDirSymVal$ = uncvol$ + MID$(DestDirSymVal$,3)
  6533.                 END IF        
  6534.         rv% = Lot_CleanPath(DestDirSymVal$)
  6535.  
  6536.             IF rv% = 0 THEN
  6537.                   ErrorMsg SID_ERR_NODENETMAP, ""
  6538.                   ERROR STFQUIT
  6539.         END IF
  6540.         END IF
  6541.     END IF
  6542.  
  6543.     Lot_GetDestDirValueFromInstallini = DestDirSymVal$
  6544. END FUNCTION
  6545.  
  6546. '*************************************************************************
  6547. PUBLIC SUB      Lot_WriteCriticalDirectories (InstallInifile$)
  6548. '**
  6549. '** Purpose:   writes out the critical directories for uninstall in 
  6550. '**            cinstall.ini, cinstnod.ini   
  6551. '** Author:    Thangv
  6552. '** Arguments: path to cinstall.ini/cinstnod.ini file 
  6553. '** Returns:   
  6554. '*************************************************************************
  6555.    DIM dirsyms%, gInstallIniFile$, prodDir$, progdir$
  6556.    DIM prodsym$, AllProdNum%, prodNum%, symList$, i%
  6557.  
  6558.       'the path to install.ini
  6559.       gInstallIniFile$ = InstallInifile$
  6560.  
  6561.    's$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6562.  
  6563.       'Loop through the products and log the directories
  6564.       AllProdNum% = 0
  6565.       AllProdNum% = Reg_GetNumberOfProducts()
  6566.       IF AllProdNum% <> 0 THEN
  6567.      'BaseDir$= GetSymbolValue(SYM_BASEDIR$)
  6568.      FOR prodNum%=1 TO AllProdNum%
  6569.         'ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  6570.         'Get the directory symbol
  6571.         symList$ = Reg_GetDirSymbolList(prodNum%)
  6572.         dirsyms% = GetListLength(symList$)
  6573.         FOR i% = 1 TO dirsyms% 
  6574.         prodsym$ = GetListItem(symList$, i%)
  6575.         progdir$ = GetSymbolValue(prodsym$)
  6576.         CreateIniKeyValue gInstallIniFile$, "Critical Directories", prodsym$, progdir$, cmoOverWrite
  6577.         NEXT
  6578.      NEXT
  6579.       END IF
  6580. END SUB
  6581.  
  6582.  
  6583. PUBLIC FUNCTION GetLastPathComponent( ByVal szPath$) AS STRING
  6584. '**
  6585. '** Purpose:   Returns the last component of a path
  6586. '**
  6587. '** Author:    GJL
  6588. '** Arguments: path 
  6589. '** Returns: The last dir name or file name, empty string if path
  6590. '**          ends in \
  6591. '*************************************************************************
  6592.     DIM offSet&, nextOff&
  6593.  
  6594.     GetLastPathComponent$ = szPath$
  6595.     offSet& = InStr(szPath$,"\")
  6596.     nextOff& = offSet&
  6597.  
  6598.     DO WHILE nextOff& <> 0
  6599.        nextOff = InStr(Mid$(szPath$,offset),"\")
  6600.        offSet& = offSet& + nextOff& 
  6601.  
  6602.     LOOP
  6603.     IF offSet& > 0 THEN
  6604.       GetLastPathComponent$ = Mid$(szPath$,offSet&)
  6605.     END IF
  6606. END FUNCTION
  6607.  
  6608. '*************************************************************************
  6609. FUNCTION Lot_AddToNTSystemPath(RegH&, RegKey$, VarName$, ByVal AddPath$) AS INTEGER
  6610.     DIM NewPath$, notused&, PathDir$
  6611.     DIM RegValLen&, Pos%, Resave%
  6612.  
  6613.     Lot_AddToNTSystemPath = 1
  6614.  
  6615.     If Lot_DoesRegKeyExistEx(RegH&, RegKey$) = FALSE THEN
  6616.         If Lot_RegCreateKeyEx(RegH&, RegKey$) <> 0 Then
  6617.             Lot_AddToNTSystemPath = 0
  6618.             EXIT FUNCTION
  6619.         End If
  6620.         NewPath = ""
  6621.     Else
  6622.         RegValLen&=CLNG(1024)
  6623.         NewPath$=CreateBuffer(RegValLen&)
  6624.         if Lot_GetRegKeyValueEx(RegH&, RegKey$, VarName$,_
  6625.                 REG_EXPAND_SZ&,NewPath$,RegValLen&) <> 0 Then
  6626.             NewPath = ""
  6627.         End If
  6628.     End If
  6629.  
  6630.     NewPath$ = NullTrim(NewPath$)        
  6631.     Resave%=0
  6632.     Do While AddPath$ <> ""
  6633.         Pos%=InStr(AddPath$,";")
  6634.  
  6635.         If Pos=0 Then
  6636.             PathDir$ = AddPath$
  6637.             AddPath = ""
  6638.         Else
  6639.             PathDir$ = Left$(AddPath$, Pos%-1)
  6640.             If RIGHT$(PathDir$,1) = "\" Then
  6641.                 PathDir$ = LEFT$(PathDir$, LEN(PathDir$)-1)
  6642.             End If
  6643.             AddPath = Right$(AddPath$, LEN(AddPath)-Pos%)
  6644.         End If
  6645.  
  6646.         If InStr(NewPath$,PathDir$) = 0 Then
  6647.            If NewPath = "" Then
  6648.                 NewPath=PathDir$
  6649.             Else
  6650.                 NewPath=NewPath$+";"+PathDir$
  6651.             End If
  6652.             Resave%=1
  6653.         End If
  6654.     Loop
  6655.     If Resave%=1 Then
  6656.         If Lot_CreateRegKeyValueEx(RegH&, RegKey$, VarName$,_
  6657.                REG_EXPAND_SZ&,NewPath$,LEN(NewPath$)+1) Then
  6658.             Lot_AddToNTSystemPath = 0
  6659.         End If
  6660.     End If
  6661.  
  6662. END FUNCTION
  6663.  
  6664. '*************************************************************************
  6665. PUBLIC FUNCTION Lot_RegAppPath(ProgName$, szProgPath$, ByVal szSearchPath$, ByVal fCompPath%, ByVal KeyWord$) AS INTEGER
  6666.  
  6667. '** Purpose:   Add application path to registry
  6668. '** Author:    OM
  6669. '** Arguments: 
  6670. '**        ProgName$:        Name of the program file
  6671. '**        szProgPath$:   This is the path of program named above. It
  6672. '**                            may be entered with or without the final '\'
  6673. '**        szSearchPath$: Directories separated by ';' to be added to search
  6674. '**                            path.  Directories should not have final '\'.
  6675. '**        fCompPath:        True if component path should be added to search
  6676. '**                            path.  False if not.
  6677. '**      KeyWord$:        The feature keyword associated with this object.
  6678. '**                            For example, "FLWCORE"
  6679. '**
  6680. '** Returns:   True if worked False otherwise
  6681. '*************************************************************************
  6682.     DIM RegKey$, RegH&, PathDir$, notused&, s$, network$ 
  6683.  
  6684.     szSearchPath$ = NullTrim(szSearchPath$)
  6685.     szSearchPath$ = LTrim(szSearchPath$)
  6686.     If fCompPath% Then
  6687.         network$ = GetSymbolValue(SYM_NETWORK$)
  6688.         IF network$ = gNODE$ THEN
  6689.             s$ = GetSymbolValue(SYM_NETCOMPONENT$)
  6690.         ELSE
  6691.             s$ = GetSymbolValue(SYM_COMPONENTSDIR$)
  6692.         END IF
  6693.         szSearchPath$ = szSearchPath$+";" + s$
  6694.         szSearchPath$ = NullTrim(szSearchPath$)
  6695.         szSearchPath$ = LEFT$(szSearchPath$,LEN(szSearchPath$)-1)
  6696.     End If
  6697.     
  6698.     Lot_RegAppPath = 1
  6699.  
  6700.     RegH&=HKEY_LOCAL_MACHINE&
  6701.     RegKey$=gREGWINNAME+gREGAPPPATH95+"\"+ProgName$
  6702.     If Lot_DoesRegKeyExistEx(RegH&, RegKey$) = FALSE THEN
  6703.         notused&=Lot_RegCreateKeyEx(RegH&, RegKey$)
  6704.     End If
  6705.     If NOT RIGHT$(szProgPath$,1) = "\" Then
  6706.         szProgPath$ = szProgPath$ + "\"
  6707.     End If
  6708.     PathDir$ = szProgPath+ProgName$
  6709.     if Lot_CreateRegKeyValueEx(RegH&,RegKey$,"",_
  6710.             REG_SZ,PathDir$,LEN(PathDir$)+1) OR _
  6711.          Lot_CreateRegKeyValueEx(RegH&,RegKey$,gREGAPPPATH95PATH,_
  6712.             REG_SZ,szSearchPath$,LEN(szSearchPath$)+1) Then
  6713.         Lot_RegAppPath = 0
  6714.     Else
  6715.         RegKey$ = gHLM$+"\"+RegKey$
  6716.         Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6717.     End If        
  6718.  
  6719.     If NOT IsNewShell() Then
  6720.         If Lot_AddToNTSystemPath(HKEY_LOCAL_MACHINE&, _
  6721.             gREGAPPPATHNT1, gREGAPPPATHNTPATH, szSearchPath$) = 0 Then
  6722.             If Lot_AddToNTSystemPath(HKEY_CURRENT_USER&, _
  6723.                 gREGAPPPATHNT2, gREGAPPPATHNTPATH, szSearchPath$) = 0 Then
  6724.                 Lot_RegAppPath = 0
  6725.             Else
  6726.                 RegKey$ = gHCU$+"\"+gREGAPPPATHNTPATH
  6727. '                Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6728.             End If
  6729.         Else
  6730.             RegKey$ = gHCU$+"\"+gREGAPPPATHNTPATH
  6731. '            Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6732.         End If
  6733.     End If
  6734.     If Lot_RegAppPath = 0 Then
  6735.         RegErrorMsg SID_ERR_REG_APPPATH, RegKey$, gREGAPPPATH95PATH, szSearchPath$
  6736.     End If
  6737. END FUNCTION
  6738.  
  6739. DIM FixupDirectorySymbolList LIST AS STRING
  6740.  
  6741. PUBLIC SUB MarkFixupSourceDirSymbol(szSubdirSymbol$)
  6742. '*************************************************************************
  6743. '** Purpose: Adds the symbol to a list of subdirectory symbols that must
  6744. '**    be reset for a node install based on contents of cinstall.ini on the
  6745. '**   server
  6746. '**  
  6747. '** Author: JMDonohue
  6748. '** Arguments:    szSubdirSymbol$    Symbol to reset
  6749. '**************************************************************************
  6750.     if (ISELEMENT(FixupDirectorySymbolList(szSubdirSymbol$)) = 0 ) then _
  6751.         FixupDirectorySymbolList(szSubdirSymbol$) = "Yes"
  6752. END SUB
  6753.  
  6754. PUBLIC SUB Lot_FixupSourceDirectories
  6755. '*************************************************************************
  6756. '** Purpose: Changes the source location for node install files based on 
  6757. '**     the location recorded in the cinstall.ini file on the server
  6758. '**  
  6759. '** Author: JMDonohue
  6760. '** Arguments: 
  6761. '**************************************************************************
  6762.     DIM ret%, s$
  6763.     DIM rc%, Src$, chapter$, Dest$, DirSym$, Sect$
  6764.  
  6765.     FORALL sym IN FixupDirectorySymbolList 
  6766.  
  6767.         chapter$ = Lot_GetFirst("", F_NOTHING)
  6768.         WHILE (chapter$ <> "")
  6769.             DirSym$ = Lot_GetChapterValStr(chapter$, F_DESTDIRSYM)
  6770.             IF DirSym$ = ListTag(sym) AND _
  6771.             INT(Lot_GetChapterValInt(chapter$,F_INOROUT)) = 1 THEN
  6772.                 Src$ = Lot_GetDestDirValueFromInstallIni(DirSym$)
  6773.                 IF Src$ <> "" THEN 
  6774.                 '' Adjust the path to account for an extra product level for the 
  6775.                 '' filename in the node .INF file
  6776.                     Src$ = OneUp(Src$)
  6777.                     IF Src$ = "" THEN GOTO SYMBOLERROR
  6778.                     s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6779.                     '' For suite, need to remove two levels
  6780.                     IF s$ = gSMARTSUITE$ THEN 
  6781.                         Src$ = OneUp(Src$)
  6782.                         IF Src$ = "" THEN GOTO SYMBOLERROR
  6783.                     END IF
  6784.                     Dest$ = GetSymbolValue(DirSym$)
  6785.                     Sect$ = Lot_GetChapterValStr(chapter$, F_NOTHING)
  6786.                     IF Dest$ <> "" and Sect$ <> "" THEN _
  6787.                         AddSectionFilesToCopyList Sect$, Src$, Dest$
  6788.                 END IF    
  6789.             END IF
  6790.             chapter$ = Lot_GetNext()
  6791.         WEND
  6792.     END FORALL
  6793.     ERASE FixupDirectorySymbolList 
  6794.     EXIT SUB
  6795.  
  6796. SYMBOLERROR:
  6797.     ErrorMsg 0, "Lot_FixupSourceDirectories: invalid symbol: "+DirSym$
  6798. '    ERROR STFQUIT
  6799.  
  6800. END SUB
  6801.  
  6802. PUBLIC FUNCTION Lot_RegIni(RegFileName$) AS INTEGER
  6803. '*************************************************************************
  6804. '** Purpose: Calls SDK program regini.exe to generate registry entries 
  6805. '**     described in script file
  6806. '** NOTE:    Entries in script file have the following format:
  6807. '**    KeyName
  6808. '**    ValueName = value
  6809. '**    e.g.,
  6810. '** \registry\machine\system\currentcontrolset\services\lanmanserver\parameters
  6811. '**      DiskSpaceThreshhold = REG_DWORD 0x00000000 
  6812. '**  
  6813. '** Author: JMDonohue
  6814. '** Arguments: 
  6815. '** RegFileName$    Name of script file for registry creation
  6816. '**************************************************************************
  6817.     Lot_RegIni = Lot_CreateConsoleProcess("regini.exe", RegFileName$)
  6818.     IF Lot_RegIni <> TRUE THEN    _
  6819.        ErrorMsg 0, "Error calling Lot_CreateConsoleProcess for regini.exe"
  6820. END FUNCTION
  6821.  
  6822. '*************************************************************************
  6823. PUBLIC SUB ComboSelChanged(BoxNo&, Inst%)
  6824. '** Purpose:   Handles change in combo box selection
  6825. '** Author:    GL
  6826. '** Arguments: 
  6827. '**        BoxNo%    combo/edit set. IDC_COMBO1 = 1
  6828. '**        Inst%        combo box item
  6829. '**
  6830. '*************************************************************************
  6831.     DIM    uncPath$, fullPath$, dirPath$
  6832.     DIM    curCombo$, uncOff&, unusedPath$
  6833.     DIM    comboBox$, editBox$
  6834.  
  6835.     comboBox = "IDC_COMBO"+Right$(Str$(BoxNo&),1)
  6836.     editBox = "IDC_EDIT"+Right$(Str$(BoxNo&),1)
  6837.  
  6838.     curCombo$ = GetListItem(comboBox, Inst%)
  6839.     fullPath$ = GetListItem("IDC_EDIT",CINT(BoxNo&))
  6840.     Lot_SplitUNCPath fullPath$, uncPath$, dirPath$
  6841.     uncOff& = INSTR(1, curCombo$, "\\") 
  6842.     IF uncOff > 0 THEN
  6843.         Lot_SplitUNCPath MID$(curCombo$, uncOff&), uncPath$, unusedPath$
  6844.     ELSE
  6845.       uncPath$ = ""
  6846.     END IF
  6847.     SetListItem "IDC_EDIT", CINT(BoxNo&), uncPath$ + dirPath$
  6848.     AddListItem SYM_UPDATELIST$, editBox
  6849.     EXIT SUB
  6850. END SUB
  6851.  
  6852. '*************************************************************************
  6853. PUBLIC FUNCTION GetPathFromComboEdit(hDlg&, BoxNo%) AS STRING
  6854. '** Purpose:   Builds path from combo/edit box
  6855. '** Author:    GL
  6856. '** Arguments: 
  6857. '**        hDlg&:    dialog handle
  6858. '**        BoxNo%    combo/edit set. IDC_COMBO1 = 1
  6859. '**
  6860. '** Returns:    Fully qualified path. Empty string on failure
  6861. '*************************************************************************
  6862.     DIM drvSel%, drvPath$, uncPath$, dirPath$, comboBox$
  6863.  
  6864.     comboBox = "IDC_COMBO"+Right$(Str$(BoxNo%),1)
  6865.     drvSel% = ValidateEditBox(hDlg&, BoxNo%)
  6866.   IF drvSel% = 0 THEN
  6867.         GetPathFromComboEdit = ""
  6868.         EXIT FUNCTION
  6869.     END IF
  6870.     Lot_SplitUNCPath GetListItem("IDC_EDIT", BoxNo%), uncPath$, dirPath$
  6871.     IF uncPath$ = "" THEN
  6872.         drvPath = LEFT$(GetListItem(comboBox, drvSel%), 2)
  6873.     ELSE
  6874.         drvPath = ""
  6875.     END IF
  6876.         GetPathFromComboEdit= drvPath$ + uncPath$ + dirPath$
  6877. END FUNCTION
  6878.  
  6879. PUBLIC SUB Lot_RegisterFonts()
  6880. '*************************************************************************
  6881. '** Purpose: Traverses the copy list looking for sections whose destination
  6882. '** directory symbol is "LOTUSFONTSDIR"; for each section, registers all 
  6883. '** font filenames with Windows, using the description corresponding to the
  6884. '** font name in 'shared.ini'
  6885. '** NOTE:    Entries in 'shared.ini' file have the following format:
  6886. '**    FontFileName = Description
  6887. '**    e.g.,
  6888. '**     ngoi____.ttf=News Gothic Italic (TrueType)
  6889. '** NOTE: This function should not be used by clients -- called as part of
  6890. '**    toolkit processing  
  6891. '**  
  6892. '** Author: JMDonohue
  6893. '**************************************************************************
  6894.     DIM s$, szSym$, szSect$, i%, j%, n%, chapter$, DirSym$, gSharedIniFile$ 
  6895.     DIM FontDescList LIST AS STRING
  6896.     DIM FontFile$, FontDesc$, winkey$, FontPath$, ret%, Size%, regStatus&, Key$ 
  6897.  
  6898.     szSym$ = "SECTIONFONTS"
  6899.    gSharedIniFile$ = MakePath(GetSymbolValue(SYM_STF_CWDDIR$), gSHAREDINI$)
  6900.     IF WhatPlatform() = PLATFORM_WIN95 THEN
  6901.         winkey$ = "Windows"
  6902.     ELSE
  6903.         winkey = "Windows NT"
  6904.     END IF
  6905.     Key$ = "SOFTWARE\Microsoft\" + WinKey$ + "\CurrentVersion\Fonts"
  6906.  
  6907.     chapter$ = Lot_GetFirst("", F_INOROUT)
  6908.     WHILE (chapter$ <> "")
  6909.         DirSym$ = Lot_GetChapterValStr(chapter$, F_DESTDIRSYM)
  6910.         IF DirSym$ = SYM_LOTUSFONTSDIR$ THEN 
  6911.             szSect$ = Lot_GetChapterValStr(chapter$, F_NOTHING)
  6912.             n% = FGetSectionFileList (szSym$, szSect$, 1)
  6913.             n% = GetListLength(szSym$)
  6914.             '' For each font in section, strip off path components
  6915.             '' and create list of filenames and descriptions        
  6916.             FOR i% = 1 TO n%
  6917.                 s$ = GetListItem(szSym$, i%) 
  6918.                 IF ISELEMENT(FontDescList(s$)) = FALSE THEN _
  6919.                     FontDescList(s$) = GetIniKeyString(gSharedIniFile$, "Fonts", s$)
  6920.             NEXT
  6921.             RemoveSymbol szSym$
  6922.         END IF
  6923.         chapter$ = Lot_GetNext()
  6924.     WEND
  6925. ' Traverse list, register all font files    
  6926. ' If font name not in database, use font name for description
  6927.     FORALL sym IN FontDescList
  6928.         FontFile$ = ListTag(sym)
  6929.         FontDesc$ = FontDescList(ListTag(sym))
  6930.         IF FontDesc$ = "" THEN FontDesc$ = FontFile$
  6931.         FontPath$ = GetSymbolValue(SYM_LOTUSFONTSDIR$) + FontFile$
  6932.         ret% = AddFontResource(FontPath$)
  6933.         Size% = len(FontPath$) + 1
  6934.         regStatus& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, _
  6935.             Key$, FontDesc$, REG_SZ, FontPath$, Size%)
  6936.     END FORALL
  6937.     
  6938. END SUB
  6939.  
  6940. PUBLIC CONST LIBFLAG_FRESTRICTED = 1 
  6941. PUBLIC CONST LIBFLAG_FCONTROL = 2 
  6942. PUBLIC CONST LIBFLAG_FHIDDEN = 4 
  6943.  
  6944. PUBLIC FUNCTION Lot_RegisterTypeLib(ID$, Version$, Description$, helppath$, filename$, flags%) AS INTEGER
  6945. '*************************************************************************
  6946. '** Purpose: Creates necessary registry entries for Type Libraries
  6947. '**  
  6948. '** Arguments: 
  6949. '**        ID$                ID, "29130064-2EED-1069-BF5D-00DD011186B7", e.g. 
  6950. '**        Version$            Version
  6951. '**        Description$    Description
  6952. '**        helppath$        Pathname of directory containing help files
  6953. '**        filename$        Fully qualified name of file
  6954. '**        flags%            See below(default is 0):
  6955. '**  
  6956. '**  Flag Value            Description
  6957. '**  LIBFLAG_FCONTROL    The type library describes controls and should not be 
  6958. '**                              displayed in type browsers intended for nonvisual objects.
  6959. '**  LIBFLAG_FRESTRICTED    The type library is restricted and should not
  6960. '**                              be displayed to users.
  6961. '**  LIBFLAG_FHIDDEN        The type library should not be displayed to users, 
  6962. '**                              although its use is not restricted. To be used by
  6963. '**                              controls; hosts should create a new type library that
  6964. '**                              wraps the control with extended properties.
  6965. '**
  6966. '** Returns:    TRUE if successful, FALSE otherwise
  6967. '**  
  6968. '** Author: JMDonohue
  6969. '**************************************************************************
  6970.     DIM key$, s$, flagstr$
  6971.     DIM LReturn& 
  6972.     
  6973.     key$ = "Typelib\" + ID$ + "\" + Version$
  6974.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, key$,_
  6975.          "", REG_SZ, Description$,  LENBP(Description$)+1)
  6976.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6977.     s$ = key$ + "\" + "0\win32"
  6978.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  6979.          "", REG_SZ, filename$,  LENBP(filename$)+1)
  6980.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6981.     s$ = key$ + "\" + "HELPDIR"
  6982.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  6983.          "", REG_SZ, helppath$,  LENBP(helppath$)+1)
  6984.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6985.     s$ = key$ + "\" + "FLAGS"
  6986.     flagstr$ = CStr(flags%)
  6987.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  6988.          "", REG_SZ, flagstr$,  LENBP(flagstr$)+1)
  6989.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6990.     Lot_RegisterTypeLib = TRUE
  6991.     EXIT FUNCTION
  6992.  
  6993. FAILED:
  6994.     Lot_RegisterTypeLib = FALSE
  6995. END FUNCTION    
  6996.  
  6997. PUBLIC FUNCTION OneUp(s$) AS STRING
  6998. '*************************************************************************
  6999. '**    Purpose: Removes the last element of a filename
  7000. '**     e.g. d:\lotus\compnent ==> d:\lotus\
  7001. '**            
  7002. '** Author:    JMDonohue
  7003. '** Arguments: s$    string to strip
  7004. '** Returns: stripped string or null string if invalid
  7005. '**     
  7006. '*************************************************************************
  7007. DIM i%
  7008.     i% = Len(s$) - 1    'Assume last character is \
  7009.     DO 
  7010.         i% = i% - 1
  7011.         IF i% = 0 THEN
  7012.             ErrorMsg 0, "Toolkit:OneUp: String does not contain \: "+s$
  7013.             OneUp = ""
  7014.             EXIT FUNCTION
  7015.         END IF
  7016.     LOOP    UNTIL Mid(s$, i%, 1) = "\"
  7017.     OneUp =  Mid(s$, 1, i%)
  7018. END FUNCTION    
  7019.  
  7020.  
  7021. PUBLIC FUNCTION Lot_AreAnyNodeOptionsAvail() AS INTEGER
  7022. '*************************************************************************
  7023. '**Purpose:Determine whether any node options are available
  7024. '**for the products selected.
  7025. '**
  7026. '**Returns:TRUE if any options are available
  7027. '**        FALSE if none
  7028. '**
  7029. '**Autor:GLutz
  7030. '*************************************************************************
  7031. DIM AllProdNum%,AllOptNum%,prodNum%,chpt$
  7032.  
  7033.   Lot_AreAnyNodeOptionsAvail = FALSE
  7034.  
  7035.   'Loop through the products and find the avail node options
  7036.   AllProdNum% = 0
  7037.   AllProdNum% = Reg_GetNumberOfProducts()
  7038.   IF AllProdNum% <> 0 THEN
  7039.     'Loop through the products
  7040.     FOR prodNum%=1 TO AllProdNum%
  7041.       AllOptNum% = 0      
  7042.       AllOptNum% = Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%)
  7043.       IF AllOptNum% <> 0 THEN
  7044.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%)_
  7045.                 + gTOP$)
  7046.         IF (INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1) THEN
  7047.           Lot_AreAnyNodeOptionsAvail = TRUE
  7048.           EXIT FUNCTION
  7049.         END IF
  7050.       END IF
  7051.     NEXT
  7052.   END IF
  7053. END FUNCTION
  7054.  
  7055. '***********************************************************************
  7056. PUBLIC FUNCTION RemovePriorVersion(ProdRegKeyName$,ProdVer$) AS INTEGER
  7057. '**
  7058. '**Removes previous installations of 32 bit product versions.
  7059. '**
  7060. '**Parameters:
  7061. '**                        ProdRegKeyName$:Product's registry name (WordPro)
  7062. '**                        ProdVer$:Version to be remove (96.0)
  7063. '**
  7064. '**
  7065. '**
  7066. DIM prodCount%, i%, status&, RegKey$, PlatformStr$
  7067. DIM cmdLine$, dwStatus&, cbBuf&, exeName$, newCmdLine$
  7068. STATIC cmdBuf(10) AS STRING, cmdCount%
  7069.  
  7070.   IF ProdRegKeyName$ = "begin" AND _
  7071.      ProdVer$ = "execution" THEN
  7072.     FOR i% = 0 TO cmdCount%
  7073.       '***This call launches uninstall
  7074.       '***dwStatus should be STILL_ACTIVE(259)
  7075.       dwStatus& = Lot_ExecUninstall(cmdBuf(i%))
  7076.           WHILE dwStatus& = STILL_ACTIVE
  7077.         dwStatus& = Lot_ExecUninstall("")
  7078.       WEND
  7079.     NEXT
  7080.   ELSEIF ProdRegKeyName$ = "reset" AND _
  7081.          ProdVer$ = "buffer" THEN
  7082.     cmdCount% = 0
  7083.   ELSE
  7084.     exeName$ = "lunin10.exe"
  7085.     PlatformStr$ = gREGWINNAME
  7086.  
  7087.     RegKey$=PlatformStr$+"\Uninstall\"+ProdRegKeyName$+" V"+ProdVer$
  7088.  
  7089.     '** returns ERROR_SUCCESS (0) 
  7090.     status& = Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE,RegKey$,_
  7091.               "UninstallString",dwStatus&,cmdLine$,cbBuf&)
  7092.  
  7093.     IF status& = ERROR_SUCCESS THEN
  7094.       cmdLine$ = NullTrim(cmdLine$)
  7095. '***for dev purposes don't use automated uninstall
  7096.         cmdBuf(cmdCount%) = MID$(cmdLine$,INSTR(1,cmdLine$,_
  7097.                         exeName$,1)) + " /A upgrade.rsp /S"
  7098.         'cmdLine$ = MID$(cmdLine$,INSTR(1,cmdLine$,exeName$,1))
  7099.     cmdCount% = cmdCount% + 1
  7100.       END IF
  7101.   END IF
  7102. END FUNCTION
  7103.  
  7104. PUBLIC SUB IncrementSharedDLLCount(s$)
  7105. '****************************************************************************
  7106. '** Purpose: Increments the shared dll count in registry.
  7107. '**
  7108. '** Author:  JGHAZAL, JMD
  7109. '** Arguments: s$     shared file fully qualified pathname
  7110. '**
  7111. '****************************************************************************
  7112. DIM regStatus&, subkey$, Descnum as variant, nsize&, Descnum2&
  7113.  
  7114.     subkey$ = "SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs"
  7115.     nsize& = 4
  7116.  
  7117.     IF Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE, subkey$, s$, REG_DWORD, Descnum, nsize&) = 0 THEN
  7118.         Descnum2& = val(Descnum) + 1
  7119.     ELSE
  7120.         Descnum2& = 1
  7121.     END IF
  7122.     regStatus& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, subkey$, s$, REG_DWORD, Descnum2&, nsize&)
  7123.  
  7124. END SUB
  7125.  
  7126.